在空数组上调用Array.prototype.reverse()?

son*_*gyy 6 javascript

注意:此问题中的代码是在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对象,而是提出异常?

jfr*_*d00 5

当您调用函数时x(),this指针将设置为windowundefined(在严格模式下).它是调用函数的方法,它决定了函数的值this.

让你控制值的调用方法this是:

x.call(xxx)
x.apply(xxx)
foo.x()
Run Code Online (Sandbox Code Playgroud)

称之为:

x()
Run Code Online (Sandbox Code Playgroud)

将设置thiswindow正常JS模式或undefined严格模式下的默认值.

您可能想要了解的另一件事是:

var x = [].reverse;
Run Code Online (Sandbox Code Playgroud)

然后,x只保存对该reverse()函数的引用.与[]您最初使用的完全没有任何关联.因此,当您调用时x(),您只是调用reverse()没有对象关联的函数,因此this将其设置为默认值,该值window处于正常JS模式或undefinedJS严格模式.

  • 你的意思是说,在严格模式下会使用`undefined`?我在Node.js上试过这个并且为`var x = [] .reverse得到了同样的错误.X();`.我甚至没有说"使用严格";` (2认同)