注意:此问题中的代码是在Chrome控制台中运行的.
当我在做JS-puzzler时,我遇到了这个问题,问题21(好吧......虽然它没有给出排序).问题询问结果:
var x = [].reverse; x();
Run Code Online (Sandbox Code Playgroud)
答案是window.正如答案所述:
[] .reverse将返回此值,并且在没有显式接收器对象的情况下调用时,它将默认为默认的此AKA窗口.
基于这种理解,我写了一些代码来测试:
function Bar(){
var x = [].reverse;
console.log(x());
}
new Bar();
Run Code Online (Sandbox Code Playgroud)
猜猜是什么..这段代码引发了一个错误:
TypeError:Array.prototype.reverse在null或undefined上调用
我想问为什么调用的x()new Bar没有显示this对象,而是提出异常?
当您调用函数时x(),this指针将设置为window或undefined(在严格模式下).它是调用函数的方法,它决定了函数的值this.
让你控制值的调用方法this是:
x.call(xxx)
x.apply(xxx)
foo.x()
Run Code Online (Sandbox Code Playgroud)
称之为:
x()
Run Code Online (Sandbox Code Playgroud)
将设置this为window正常JS模式或undefined严格模式下的默认值.
您可能想要了解的另一件事是:
var x = [].reverse;
Run Code Online (Sandbox Code Playgroud)
然后,x只保存对该reverse()函数的引用.与[]您最初使用的完全没有任何关联.因此,当您调用时x(),您只是调用reverse()没有对象关联的函数,因此this将其设置为默认值,该值window处于正常JS模式或undefinedJS严格模式.