博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何理解 (object.getName = object.getName)() 这段代码?
阅读量:6266 次
发布时间:2019-06-22

本文共 1291 字,大约阅读时间需要 4 分钟。

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'。

转载地址:http://uuvpa.baihongyu.com/

你可能感兴趣的文章
文件磁盘命令(就该这么学6章内容)
查看>>
2016-207-19 随笔
查看>>
java的double类型如何精确到一位小数?
查看>>
看看国外的javascript题目,你能全部做对吗?
查看>>
ffmpeg 如何选择具有相同AVCodecID的编解码器 (AVCodec)
查看>>
真正解决 Windows 中 Chromium “缺少 Google API 密钥” 的问题
查看>>
Spring 之 AOP
查看>>
软件项目管理|期末复习(二)
查看>>
直接调用VS.net2005中的配置界面
查看>>
程序员的自我修养五Windows PE/COFF
查看>>
关于字符集,编码格式,大小端的简单总结
查看>>
js string 转 int Number()
查看>>
课堂练习:ex 4-20
查看>>
20155328 2016-2017-2 《Java程序设计》 第8周学习总结
查看>>
python操作redis--string
查看>>
echarts图表初始大小问题及echarts随窗口变化自适应
查看>>
Inherits、CodeFile、CodeBehind的区别
查看>>
创建一个SimpleDlg
查看>>
使用XML生成菜单
查看>>
udp,tcp对于socket的写法
查看>>