从外部定义的函数访问作用域中的变量
Access to variables in scope from a function defined externally
有没有一种方法可以从闭包外定义但在闭包内引用的函数中打印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,但仍然引用临时变量而不必传递参数吗?
我读到javascript没有动态运行时作用域,它只是词法作用域,但通过引用funcB中的函数(funcAvia funcC),是否有方法满足词法作用域要求并为funcB提供对作用域变量的访问?
利用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
是,不。
声明变量的关键字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元素。
- 带有KendoUI组件的Javascript变量作用域
- Javascript变量作用域:从回调函数中提取变量
- 使用JavaScript回调函数了解变量作用域和闭包
- jquery.post和变量作用域
- 变量作用域:在函数之间传递的名称
- 在 AJAX 和 Javascript 中使用变量和变量作用域
- 节点.js/express.js中的变量作用域
- jquery ajax 回调变量作用域(为什么有些在作用域中,而另一些则不在作用域中)
- JavaScript 中的变量作用域
- ajax GET 和 POST 中的变量作用域
- Javascript:变量作用域和全局变量的弊端
- Javascript 自执行函数和变量作用域
- 拼接上的Javascript全局变量作用域/覆盖
- 在Node中与jsdom和jquery共享变量作用域
- NodeJS:代码优化和变量作用域
- Javascript数组变量作用域
- AngularJS ng控制器指令不接受javascript中的变量(作用域函数),也不给出任何错误
- 回调函数中的变量作用域呢
- JavaScript/jQuery变量作用域导致错误
- AJAX变量作用域