先看一段有意思的代码
var length = 10; function fn() { console.log(this.length); } var obj = { length: 5, method: function(fn) { fn(); arguments[0](); } }; obj.method(fn,1);
浏览器环境
输出结果是10和2。
先说第一个:
执行过程大致如下:
obj.method这是个obj对象的方法,而传入的fn是个函数,fn()属于调用模式的”函数调用”,非严格模式下,this为global对象(浏览器中就是window)。
而在这段代码的最上方使用var定义了length,由于var是直接写在global作用域中的,所以此处的 var length 与 window.length是同一个东西。输出10也就不奇怪了。
那么来看第二个:
arguments这个是在函数内部才有的参数,很像array,而且typeof得到的也是object值,我们知道,js访问对象有 . 操作符 和 中括号操作符,此处使用的是第二种方法获取到obj.method的第一个参数,也就是fn.
由于arguments[0]()是输入调用方式中的“方法调用模式”,this指向对象本身,也就是arguments,所以会输出2。
Nodejs环境
这段代码在nodejs下面会输出
undefined
2
第二个输出2的原因跟浏览器下一致,就不说了,来看看第一个undefined
根本原因在于nodejs的global处理机制不同。
global贯穿与nodejs整合生命周期,而每个js文件是单独的模块,就算使用var定义在顶层,也只是这个module的全局变量。所以会输出undefined、
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 函数
, 浏览器
, 代码
, this
模式
回调函数里的this指向、this调用构造函数、s函数 调用不同文件夹、php调用不同页面函数、调用不同周期函数,以便于您获取更多的相关知识。