在js中,变量分为全局变量和局部变量。全局变量的作用域是全局的,在任意地方都是被定义的。而局部变量可以是函数的参数、函数内定义以及{}内(ES6语法)定义,如果局部变量与全局变量重名的话,会优先取局部变量。下面我们来看看例子:
引用全局变量例子:
var num = 1; //定义一个全局变量
function func(){
console.log(num); //这里引用了全局变量
}
func(); //输出:1
同名变量优先局部变量例子:
var num = 1; //定义一个全局变量
function func(){
var num = 2; //声明局部变量时一定要使用var,否则解释器会将该变量当做全局对象window的属性
console.log(num); //这里引用了局部变量
}
func(); //输出:1
变量在声明它们的函数体以及这个函数体内的任意函数体都是定义的,请看例子:
function func(){
var num = 1;
console.log(num); //输出:1
function func1(){
console.log(num); //输出:1
}
func1();
}
func();
把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止,当函数中需要查询一个变量的值的时候,js解释器会去从作用域链查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续,如果找到最后也没有找到需要的变量,则解释器返回undefined。请看例子:
例子1:
var num = 1;
function func(){
var num = 2;
function func1(){
var num = 3;
console.log(num); //输出:3 先找函数自身的本地变量
}
func1();
}
func();
例子2:
var num = 1;
function func(){
var num = 2;
function func1(){
console.log(num); //输出:2 先找函数自身的本地变量,再找父级函数中的变量
}
func1();
}
func();
例子3:
var num = 1;
function func(){
function func1(){
console.log(num); //输出:1 先找函数自身的本地变量,再找父级函数中的变量,然后再找到全局对象的变量
}
func1();
}
func();
例子4:
function func(){
function func1(){
console.log(num); //输出:undefined 先找函数自身的本地变量,再找父级函数中的变量,然后再找到全局对象的变量,还是没找到就返回undefined
}
func1();
}
func();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。