立即执行函数的this指向是window(非严格模式下)

请问以下JS代码最后输出的len值是多少?

var len = 117; let func = { len: 935, showLen: function() { console.log(this.len); }, show: function() { (function(cb) { cb(); })(this.showLen) } } func.show();

正确答案 117

立即执行函数的this指向是window(非严格模式下),
因为作为一个匿名函数,在被调用的时候,我们往往就是直接调用,因此它的this是非常确定的,那么len就取window下的len值了即117。

// 在JavaScript的函数中,this始终指向调用者的上下文环境 var len = 117 // 5. 全局作用域中使用 var 定义的变量默认会成为 window 的属性,及 window.len let func = { len: 935, showLen: function () { console.log(this.len) // 4. this 此时指向的是 window,所以相当于打印 window.len }, show: function () { (function (cb) { cb() // 3. cb 相当于 cb.call() 默认没有传入上下文环境时 this 指向全局的 window 对象 })(this.showLen) // 2. this 是 func 所以传入的是上面定义的 showLen 函数 } } func.show() // 1. 相当于 func.show.call(func),此时 this 是 func

var len=117;我们可以发现这个是用var声明的,属于全局变量,所以打印的结果为117;
若将var改为let,则打印的结果为undefined
因为let声明的全局变量不会挂载到window下面,但var会

函数只要不是new出来的,内部this指向都是window,其他的this指当前块

在非严格模式下,独立函数调用内部this都执行window, 函数直接调用,即没有打点调用或者作为构造函数调用,this指向window,和是不是立即执行函数没有关系。不信执行下面的代码。

var len = 117; let func = { len: 935, showLen: function() { console.log(this.len); }, show: function() { const f = function(cb) { cb(); } f(this.showLen) } } func.show();

结果也是117


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/17817301.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示