有没有办法从闭包外定义的函数打印temp(闭包变量)的值,但是在闭包内引用而不将temp作为变量传递给funcA?
var funcA, funcB;
funcA = function () {
console.log(temp);
}
funcB = function () {var temp, funcC;
temp = 1;
funcC = funcA;
funcC();
}
funcB(); // temp is undefined.
这样可行,但只是因为funcA是在funcB中定义的:
funcB = function () {var temp, funcA, funcC;
temp = 1;
funcA = function () {
console.log(temp);
}
funcC = funcA;
funcC();
}
funcB(); // 1
我正试图找到一种方法从外部函数中提取一些函数定义,以简化有些复杂的代码。我可以在funcB之外定义funcA但仍然引用temp变量而不必传递参数吗?
我读到javascript没有动态运行时作用域,它只是词法作用域,但是在funcB中引用一个函数(funcA通过funcC),是否有办法满足词法范围要求并提供对作用域的访问funcB的变量?
答案 0 :(得分:1)
使用Akinkunle Allen的评论,我想出了这个似乎可以解决我的问题。
function funcB () {
var funcA, funcB, temp;
funcA = function () {
console.log(temp);
}
funcB = function () {var funcC;
temp = 1;
funcC = funcA;
funcC();
}
return funcB();
}
funcB(); // 1
答案 1 :(得分:1)
是,否。
用于声明变量的关键字var
的行为会有所不同,具体取决于当前范围。在全局范围内执行var
时,它是可选的。变量成为全局对象的属性。在浏览器中执行时,此全局对象为window
。
因此,全局空间中的以下内容具有相同的结果。
var temp = 1;
window.temp = 1;
this.temp = 1;
由于全球背景,上述所有内容仅为window.temp
。
在函数内部使用var
时,变量附加到函数中。 Javascript中的所有函数都是对象,因此只要父函数仍在某处使用,本地var
变量就会存在。
Javascript将遍历执行范围的层次结构以查找变量标识符。因此,任何内部函数都可以访问它们的外部函数变量(如示例所示)。
你可以做的就是在函数中使用this
引用。
Javascript中的标识符this
是动态的(意味着您可以更改它)。我可以将变量传递给在调用函数外声明的未知函数。由于this.temp
用于引用变量,因此函数funcA
能够显示该值。
funcB = function(otherFunc)
{
this.temp = 1;
otherFunc();
}
funcA = function()
{
alert(this.temp);
}
funcB(funcA);
http://jsfiddle.net/thinkingmedia/dfLvj/
参见上面的jsfiddle示例。
你可以做的就是动态改变this
的含义。这是一个更好的例子。
funcB = function(otherFunc)
{
var temp = {
message: "Hello World!"
};
var foo = otherFunc.bind(temp);
foo();
}
funcA = function()
{
alert(this.message);
}
funcB(funcA);
http://jsfiddle.net/thinkingmedia/K5Pw6/
通过允许函数接受将使用自定义this
引用执行的闭包引用,动态更改this
可以带来很多好处。
示例可能是单击事件处理程序,其中this
是触发事件的DOM元素。