• Javascript 匿名函数与闭包


    请见如下一个闭包示例:

    color = "red";
    var obj = {
        color: "blue",
        getColor: function () {
            function displayColor() {
                return this.color;
            }
            return displayColor();
        }
    }
    console.log(obj.getColor());

    在getColor函数内部再定义了一个displayColor,再又定义了一个displayColor函数,从而形成闭包,最后将地上displayColor函数返回,这里发现这样定义其实作用不大,可以使用匿名函数替代直接返回:

    color = "red";
    var obj = {
        color:"blue",
        getColor: function () {
            return function() {
                 return this.color;
            }
        }
    }
    console.log(obj.getColor()());    //输出 red

    闭包中匿名函数和this对象

    在javascript 中this 对象是基于函数的执行环境绑定的:在全局函数中, this等于全局环境即 window (浏览器环境)或者globle(node中),而当函数作为某个对象的方法调用时this等于该对象。不过匿名函数的执行环境具有全局性,其this 通常指向window(浏览器)或者globle(node环境),因此上面例子中,输出的是全局对象的 color定义。

    为什么没有获得闭包外面定义的blue呢?

    如前文所述,函数被调用时,其活动对象会取得两个特殊的变量,arguments和this,因此在搜索的时候在作用域链的最前端即当前活动对象中就查找到了,不会进一步向上层查找。不过我们可以把外部作用域的this对象保存在一个闭包能够访问到的变量里,这样就能够访问外层对象了:

    color = "red";
    var obj = {
        color:"blue",
        getColor: function () {
            var self=this;
            return function() {
                 return self.color;
            }
        }
    }
    console.log(obj.getColor()());   //输出 blue

    最后,看一道百度2015年 前端开发南京站笔试题:

    var myObject = {
        foo: "bar",
        func: function() {
            var self = this;
            console.log("outer func:  this.foo = " + this.foo);    //输出 bar
            console.log("outer func:  self.foo = " + self.foo);    //输出 bar
            (function() {
                console.log("inner func:  this.foo = " + this.foo);   //输出 undefined
                console.log("inner func:  self.foo = " + self.foo);   //输出 bar
            }());
        }
    };
    myObject.func();

    问,输出结果是什么? 相信现在应该比较好理解了。

  • 相关阅读:
    maven学习(十六)——使用Maven构建多模块项目
    jsp页面提示“Multiple annotations found at this line:
    SQL中Truncate语法
    java时间工具类,时间相互转换
    Date转换为LocalDateTime
    新建的maven项目里没有src
    maven-version
    spring-boot-configuration-processor
    python爬取文件时,内容为空
    IntelliJ IDEA 创建的文件自动生成 Author 注释 签名
  • 原文地址:https://www.cnblogs.com/zztt/p/3984143.html
Copyright © 2020-2023  润新知