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

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值