资讯专栏INFORMATION COLUMN

如何理解 (object.getName = object.getName)() 这段代码?

hzx / 2226人阅读

摘要:此段代码出自高级程序设计第版,代码片段如下理解此段代码,首先要明确一个点赋值语句是有返回值的,返回值就是所赋的值也就是右边的值。那么上面这个赋值语句的返回值就是指向的函数体本身了那么其实就相当于该段代码的调用者为,所以指向,最终结果为。

1.

此段代码出自《JavaScript高级程序设计(第3版)》 p.183,代码片段如下:

var name = "The Window";
var object = {
    name : "My Object",
    getName: function(){
         return this.name;
    }
};
(object.getName = object.getName)(); //"The Window" 

理解此段代码,首先要明确一个点:赋值语句是有返回值的,返回值就是所赋的值(也就是‘=’右边的值)。

object.getName = object.getName ;

上面这行代码的含义就是:将等号左边 object 对象的 getName 方法赋值为 object.getName。(刚看这段代码时犯了一个错误,即getName 方法后面是没有加括号的,也即是函数不执行,仅仅是传递了它的引用。)

那么上面这个赋值语句的返回值就是 object.getName 指向的函数体本身了:

function(){
   return this.name;
}

那么 (object.getName = object.getName)();其实就相当于:

(function(){
   return this.name;
})();

该段代码的调用者为 window,所以 this 指向window,最终结果为 "The Window"。

2.

怎样理解红宝书182页这段代码。

var name = "The Window";

var object = {
    name : "My Object",

    getNameFunc : function() {
        return function() {
            return this.name;
        };
    }
};

alert(object.getNameFunc()());

首先定义了一个全局变量 name = "The Window";随后在 object 对象里又重新给 name 赋值为 "My Object",但是此时 name 为局部变量,object 对象还有一个方法 getNameFunc ,这个方法返回一个闭包。

object.getNameFunc()() 这一表达式其实可以分解为两步:

var first = object.getNameFunc(),调用 getNameFunc 方法,那么就相当于:

var first = function() {
    return this.name;
};

var second = first(),调用第一步返回的闭包,相当于:

var second = function() {
    return this.name;
}();

而此时是在全局作用域中调用 first 函数,所以里面的 this 对象等于 window,那么 返回的是:window.name,就是"The Window"。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95926.html

相关文章

  • 前端学习笔记之闭包——看了一张图终于明白啥是闭包了

    摘要:在一个闭包环境内修改变量值,不会影响另一个闭包中的变量。直到看到函数闭包闭包这篇文章的代码一部分,终于明白其中的逻辑了。 闭包 闭包定义:指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。函数内部可以直接读取全局变量。函数内部变量无法在函数外部访问。函数内部声明要用var或者let声明,不然会变成全局变量链式作用域:子对象会一级级向上寻找...

    andycall 评论0 收藏0
  • JavaScript之关于this对象

    摘要:不过匿名函数的执行环境具有全局性,因此其对象通常指向。在闭包中使用对象可能会导致一些问题。这个对象还包含一个方法它返回一个匿名函数,而匿名函数又返回,这个匿名函数就是闭包。伪代码过程在定义匿名函数之前,把对象赋值给了一个名叫的变量。 this对象 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下。如有纰漏...

    happyfish 评论0 收藏0
  • JS的闭包与this详解

    摘要:删除对匿名函数的引用,以便释放内存在匿名函数从中被返回后,它的作用域链被初始化为包含函数的活动对象和全局变量对象。闭包与变量我们要注意到,闭包只能取到任意变量的最后值,也就是我们保存的是活动对象,而不是确定值。 工作中会遇到很多 this对象 指向不明的问题,你可能不止一次用过 _self = this 的写法来传递this对象,它每每会让我们觉得困惑和抓狂,我们很可能会好奇其中到底发...

    fireflow 评论0 收藏0
  • 理解JavaScript中的this

    摘要:别的文章一来就举例子,我这里首先告诉大家一个结论指向的是调用函数的那个对象。这里依然是之前的例子中的俗称箭头函数,使用它来定义匿名函数,同样可以解决的绑定问题这是由于函数体内的就是定义时所在的对象,而不是执行时所在的对象。 一、结论在前 javascript中的this是一个老生常谈的话题,但不知道是之前那些作者没讲清楚还是我太笨没能理解,始终没能真正理解它,随着自己在项目过程中的大量...

    genedna 评论0 收藏0
  • JavaScript 闭包

    摘要:闭包的注意事项通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止。最后通过释放了和对闭包的引用。从而使用闭包模块化代码,减少全局变量的污染。 JavaScript 闭包 原文链接 什么是闭包(Closure) 简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。 MDN 上面这么说:闭包是一种特殊的...

    zhou_you 评论0 收藏0

发表评论

0条评论

hzx

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<