时间:2021-05-26
变量作用域是程序中定义这个变量的区域。
先来看一段示例:
全局作用域与局部作用域
全局(global)变量的作用域是全局的,在Javascript中处处有定义;而函数内部声明的变量是局部(local)变量,其作用域是局部性的,只在函数体内部有定义。对于下面的输出读者应不会感到意外。
全局变量作用域中使用变量可以不用var语句,但在声明局部变量是一定要使用var语句,否则会视为对全局变量的引用。看下面代码:
没有块作用域
Javascript没有块级作用域,函数中声明的变量在整个函数中都是有定义的。对于下面的代码对于生疏的读者可能颇感意外:
由于语句4.1(var scope = "local";)声明的变量在整个checkScope函数作用域内都有效,因此在语句4.2(document.write(scope); )执行的时scope引用的是局部变量,而此时局部变量scope尚未定义,所以输出”undefined”。因此一个好的编程习惯是将所有的变量声明集中起来放在函数的开头。
在了解了上述内容之后,读者再看看代码1应该不会感到困惑了。
对象的属性变量
对象的属性变量比较容易理解,看一下下面的代码读者应该不会感到疑惑。
所谓作用域,就是说这个变量在代码块中的有效范围。如果不理解 JavaScript 作用域,调试代码的时候可能会比较困难。
在函数中,如果用var来声明一个变量,那么该变量的作用域就只限于该函数内部,函数外的代码无法访问该变量。如果在该函数中再声明一个函数,那么这个内部的函数也可以访问这个变量。
反过来,如果声明变量的时候没有用var,那么此变量的作用域就不局限于这个函数了。JavaScript 引擎会再全局范围中检查该变量是否被定义过。如果该变量没有被定义过,那么它就会被定义为一个全局变量。
函数可以访问相同作用域中的变量:
var foo = 'hello';var sayHello = function() { console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // also logs 'hello'变量作用域之外的代码不能访问该变量:
var sayHello = function() { var foo = 'hello'; console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // doesn't log anything不用作用域中名称相同的变量,有不同的值:
var foo = 'world';var sayHello = function() { var foo = 'hello'; console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // logs 'world'函数定以后可以看到函数内变量值的改变:
var myFunction = function() { var foo = 'hello'; var myFn = function() { console.log(foo); }; foo = 'world'; return myFn;};var f = myFunction();f(); // logs 'world' -- haha作用域也会穿越 — 闭包
// 一个自执行的匿名函数(function() { var baz = 1; var bim = function() { alert(baz); }; bar = function() { alert(baz); };})();console.log(baz); // 在函数外面不能访问 bazbar(); // 声明 bar 的时候并没有用 var // 所以 bar 是一个全局变量; 但是, // bar 和 baz 在相同的作用域内被定义, // 所以 bar 可以访问 baz // 其实 bar 是个闭包函数bim(); // bim 的作用域只限于匿名函数内部, // 所以这里不能调用综合
所谓作用域,就是说这个变量在代码块中的有效范围。如果不理解 JavaScript 作用域,调试代码的时候可能会比较困难。
在函数中,如果用var来声明一个变量,那么该变量的作用域就只限于该函数内部,函数外的代码无法访问该变量。如果在该函数中再声明一个函数,那么这个内部的函数也可以访问这个变量。
反过来,如果声明变量的时候没有用var,那么此变量的作用域就不局限于这个函数了。JavaScript 引擎会再全局范围中检查该变量是否被定义过。如果该变量没有被定义过,那么它就会被定义为一个全局变量。
函数可以访问相同作用域中的变量:
var foo = 'hello';var sayHello = function() { console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // also logs 'hello'变量作用域之外的代码不能访问该变量:
var sayHello = function() { var foo = 'hello'; console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // doesn't log anything不用作用域中名称相同的变量,有不同的值:
var foo = 'world';var sayHello = function() { var foo = 'hello'; console.log(foo);};sayHello(); // logs 'hello'console.log(foo); // logs 'world'函数定以后可以看到函数内变量值的改变:
var myFunction = function() { var foo = 'hello'; var myFn = function() { console.log(foo); }; foo = 'world'; return myFn;};var f = myFunction();f(); // logs 'world' -- haha作用域也会穿越 — 闭包
// 一个自执行的匿名函数(function() { var baz = 1; var bim = function() { alert(baz); }; bar = function() { alert(baz); };})();console.log(baz); // 在函数外面不能访问 bazbar(); // 声明 bar 的时候并没有用 var // 所以 bar 是一个全局变量; 但是, // bar 和 baz 在相同的作用域内被定义, // 所以 bar 可以访问 baz // 其实 bar 是个闭包函数bim(); // bim 的作用域只限于匿名函数内部, // 所以这里不能调用声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
主要内容:1、分析JavaScript的词法作用域的含义2、解析变量的作用域链3、变量名提升时什么最近在传智播客讲解JavaScript的课程,有不少朋友觉得J
1、Javascript变量作用域javascript中,变量主要分为局部变量和全局变量两种,对应的作用域也是局部作用域和全局作用域。1局部变量和作用域局部变量
作用域是可访问变量的集合。JavaScript作用域在JavaScript中,对象和函数同样也是变量。在JavaScript中,作用域为可访问变量,对象,函数的
一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,
一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域。变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,