《权威指南》笔记 -- 8.5 、8.6

来源:互联网 发布:哪里能找到工资数据 编辑:程序博客网 时间:2024/04/30 13:13

8.5 作为命名空间的函数

问题:js中无法声明一个代码块内可见的变量。
解决方法:简单定义一个函数用作临时的命名空间。
优点:函数内的变量,不会污染全局命名空间。

把8-3的代码根据自己记忆理解敲了一遍

<!--     extend()拓展函数    arguments        - length : 2+        |        - type : object    作用:将后面参数的属性,拓展到第一个参数中 --><!DOCTYPE html><html><head>    <meta charset="utf-8">    <title></title></head><body>    <script type="text/javascript">    var extend = (function(){        //如果能在{toString:null}遍历盗toString属性,说明没有这个bug        //在ie中,与object中自带属性重名的属性,是无法被遍历的        for(var p in {toString:null}){            return function extend(o){                for(var i = 1; i < arguments.length;i++)                {                    var source = arguments[i];                    for(var prop in source)                    {                        o[prop] = source[prop];                    }                }                return o;            }        }        //下面是存在bug的情况        //Object.prototype上的属性不能被枚举        //在末尾将这些属性单独拿出来,一一遍历        return function patched_extend(o){            for(var i = 1; i<arguments.length ; i++)            {                var source = arguments[i];                for(var prop in source)                {                    o[prop] = source[prop];                }                for(var j=0;j<protoprops.length;j++)                {                    var prop = protoprops[j];                    o[prop] = source[prop];                }            }            return o;        }        var protoprops = ["toString","valueOf","constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString"];    }());        var a = {name:"qix"}, b = {age:12},c = {toString:"这是一个属性"};        extend(a,b,c);    </script></body></html>

这里写图片描述

闭包

这里有篇关于闭包的文章,讲述清晰明了。
http://blog.rainy.im/2015/07/04/scope-chain-and-prototype-chain-in-js/

0 0
原创粉丝点击