Javascript作用域问题:变量未被识别
Javascript scope issue: variable not being identified
我有两个函数,一个函数调用另一个函数。
下面是我创建的代码结构的一个简单类比:
function test1(){
alert(a);//a is not identified here even when test1() is called under test2 which has a defined in scope
alert(b);//b is identified here
}
function test2(){
var a = 'a';//Defining a
test1();//Calling test1()
}
var b = 'b';
test2();
根据上面的代码,函数test1()能够识别变量b,但不能识别变量a。
我的问题是,为什么变量a不在test1函数的范围内,即使我们在定义变量a的test2()中调用test1() ?
函数在创建时记住它们的作用域链,而不是在调用时记住它们。
注意b
被"提升",所以你的代码实际上是这样做的:
var b; // push b on scope chain
function test1(){ // store scope chain [b]
alert(a);
alert(b);
}
function test2(){ // store scope chain [b]
var a; // push a on scope chain
a = 'a';
test1(); //Calling test1() which still has scope chain [b], not [b,a]
}
b = 'b';
test2();
您对变量范围的期望是错误的,
根据你的代码,b
是2个函数的全局变量,a
只是在test2
函数的范围内,因为它是在test2
中定义的。如果你想要一些你所期望的东西,你可以在test2
范围内定义test1
函数,像这样,
function test2(){
var a = 'a';
test1();
function test1(){
alert(a);
alert(b);
}
}
var b = 'b';
test2();
JavaScript具有'函数作用域',这意味着在函数中定义的任何内容在函数外部都不可见。因此,变量'a'在test2之外不可见。然而,变量'b'是一个全局变量,所以它在每个作用域中都是可见的。
函数作用域也意味着内部函数可以访问外部函数中定义的东西,但这在这里不起作用…test1是test2内部从调用的,但它不是test2的内部函数。要查看实际效果,您需要在test2…
中定义test1函数的主体。function test2(){
var a = 'a';//Defining a
test1();//Calling test1()
function test1(){
alert(a);//a is identified here because of function scope
alert(b);//b is identified here because it's global
}
}
带参数调用函数是一种很好的做法。这将使您的代码易于阅读和维护。只需向函数中添加参数就可以使代码工作:
function test1(a,b){
alert(a);
alert(b);
}
function test2(b){
var a = 'a';
test1(a,b);
}
var b = 'b';
test2(b);
如果你不想在函数声明中使用参数,一个解决方案是在代码中使用arguments对象:
function test1(){
alert(arguments[0]);
alert(arguments[1]);
}
function test2(){
var a = 'a';
test1(a,arguments[0]);
}
var b = 'b';
test2(b);
如果你愿意,你可以使用默认值作为参数。因为在JavaScript中你不能在函数参数列表中这样做,所以它在函数体中完成:
function test1(a,b){
a = a || 'a';
b = b || 'b';
alert(a);
alert(b);
}
function test2(b){
var a = 'a';
test1(a);//here b is not passed to the function and b will get the default value
}
var b = 'some new string for b';
test2(b);
Live on jquery
根据你的函数,你已经在函数"test2()"中声明并定义了变量"a",所以变量"a"的范围被限制在该函数本身内,访问该变量将返回"undefined"。但它不是在全局声明和定义的变量"b"的情况下,所以它可以在脚本部分的任何地方访问。
- 函数无法识别初始化的变量
- angular/javascript无法识别函数内部的全局变量
- 在javascript中未将变量识别为变量
- 在JSP函数中写入的变量无法识别
- ng使用一个不识别临时变量形式ng repeat的函数绑定html
- javascript函数无法识别传递给它的角度变量
- 无法识别一个 js 文件中的变量
- JavaScript 如何重新识别事件对象变量
- 为多个变量定义相同的类型,在Webstorm中识别
- 在javascript中创建的按钮无法识别变量
- 全局范围内的变量在 javascript 中无法识别
- 下划线 _.模板无法识别变量
- (Javascript)脚本获胜't只计算一次,可能没有识别变量
- 浏览器不能识别变量
- . js.ERB不能识别变量
- NodeJS函数不识别变量
- JavaScript IF语句不能识别变量
- 如何识别变量I'我想用JavaScript进行比较
- JavaScript upTime函数-不识别变量的ID
- 如何识别变量JSON.stringify