gpt4 book ai didi

Revealing Module Pattern 的 Javascript 作用域问题

转载 作者:行者123 更新时间:2023-11-30 08:36:17 26 4
gpt4 key购买 nike

还有一个 JavaScript 作用域问题。我相信这与“提升”无关。

我这里有一小段代码 - http://jsfiddle.net/0oqLzsec/2/

var c = function(){
var x = 'before',
callBefore = function(){
alert(x);
},
callAfter = function(){
_callAfter();
};

return{
callBefore : callBefore,
callAfter : callAfter
}

var y = 'after';

function _callAfter(){
alert(y);
}
};

var obj = c();
obj.callBefore();
obj.callAfter();

callAfter() 始终提示“未定义”,即使变量 y 是在 _callAfter() 之前定义的。但是,如果我将变量 y 声明移到变量 x 之前,它就可以工作。

我想知道下面定义的callAfter()是否可以_callAfter(),为什么它不能读取变量y?

最佳答案

_callAftery 都被提升,这使得它们在函数调用中被称为局部变量。 _callAfter 函数可以被调用(就像您所做的那样),它还会关闭变量 y。但是,在您从 c 函数返回之前,此变量未获得赋值 值。因此,您得到 undefined。如果在返回之前放置 var y;,在返回之后放置 y='after';,结果是一样的。

换句话说,下面两个是等价的:

function foo(){
var a;
return function(){ return a };
a = 42; // never runs
}
alert( foo()() );

function bar(){
return function(){ return a };
var a = 42;
}
alert( bar()() );

这是一个示例,显示局部变量被提升和关闭,即使函数文字出现在代码中的 var 之前也是如此:

function build() {
return function(newValue) {
alert("was: " + oldValue);
oldValue = newValue;
alert("now: " + oldValue);
}
var oldValue = 42;
}

f = build();
f(17);
// was: undefined
// now: 17

f(99);
// was: 17
// now: 99

关于Revealing Module Pattern 的 Javascript 作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148782/

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