gpt4 book ai didi

javascript - 在 Javascript 中, "this.something"是否查找 "something"的作用域链?

转载 作者:行者123 更新时间:2023-11-29 19:21:33 25 4
gpt4 key购买 nike

这就是我的意思。我正在练习我的面向对象的 Javascript(我通过练习学习),为了好玩而创建了以下类

function Funcstack ( ) 
{
this.stack = []; // stack/array of functions w/ no params

this.pushFunction = function ( f )
{
// f: function w/ no params
this.stack.push(f);
}

this.popFunction = function ( f )
{
// f: function w/ no params
var n = this.stack.length;
if (n > 0) this.stack.splice(n - 1, 1);
}
this.executeFunctions = function ( )
{
// execute functions from top to bottom of stack
for ( var i = (this.stack.length - 1); i >= 0; --i )
{
var thisfunc = this.stack[i];
thisfunc();
}
}
}

var fs = new Funcstack();
fs.pushFunction(function() { console.log('z'); });
fs.pushFunction(function() { console.log('y'); });
fs.pushFunction(function() { console.log('x'); });
fs.executeFunctions(); // should print 'xyz'

并对它的工作感到惊讶。主要原因是因为我认为,例如,在

      this.pushFunction = function ( f ) 
{
// f: function w/ no params
this.stack.push(f);
}

函数体无法识别 this.stack 因为 this 在特定上下文中指的是调用函数 pushFunction '有一个名为 stack 的成员!那么我认为它查找了作用域链是否正确?这似乎与 this 的整个想法相矛盾,尽管......它有什么意义?

最佳答案

简短的回答是“否”。执行上下文的 this 总是在当前执行上下文中解析,因此它与范围无关。对于宽箭头函数,它被设置为与外部执行上下文相同的值。

函数的 this 由调用函数的方式或通过 bind 设置来设置。它不是按词法设置的(调用在代码中的位置)或调用函数的位置。

如果 this 是一个对象(总是在非严格模式下),那么它的属性的解析方式与解析任何对象的属性的方式相同,首先是它自身,然后是它的 [[原型(prototype)]] 链。将函数作为对象的方法调用的地方:

fs.executeFunctions();

然后 基础对象 (fs) 在函数中被设置为 this。因此,当 this.stack.length 被解析时,this 引用 fs 实例并且 executeFunctions 被解析为fs 的属性。

关于javascript - 在 Javascript 中, "this.something"是否查找 "something"的作用域链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32792012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com