JavaScript的变量和作用域
函数外声明:全局变量
函数内声明:局部变量
注意:如果在函数中创建局部变量时未写var关键字,则为全局变量
变量提升:
1、javascript的变量声明会被提升到它们所在函数的顶部。而初始化仍在原来的地方
2、JavaScript并没有重写代码;每次调用函数时,声明都会重新提升
函数外声明:全局变量
函数内声明:局部变量
注意:如果在函数中创建局部变量时未写var关键字,则为全局变量
变量提升:
1、javascript的变量声明会被提升到它们所在函数的顶部。而初始化仍在原来的地方
2、JavaScript并没有重写代码;每次调用函数时,声明都会重新提升
function prison () {
console.log(prisoner);//undefined
var prisoner = 'Now I am dedined';
console.log(prisoner);//Now I am dedined
}
prison();
高级变量提升和执行环境对象
JavaScript引擎工作步骤:
第一轮:初始化变量
1、声明并初始化函数参数
2、声明局部对象,包括将匿名函数赋给一个局部变量,但并不初始化它们
3、声明并初始化函数
第二轮:执行代码
声明并初始化函数参数
function myFunction( arg1, arg2 ) {
//声明局部对象,包括将匿名函数赋给一个局部变量,但并不初始化它们
var local_var = 'foo'
var a_function = function () {
console.log('a_function ')
};
//声明并初始化函数
function inner() {
console.log('inner')
}
}
myFunction(1, 2)
注:在第一轮中,局部变量并未被赋值,因为可能在代码执行之后才能确定它的值,而第一轮不会执行代码
函数参数被赋值了,因为在向函数传递参数前,任何决定参数值得代码都已经执行了
变量在声明前是未定义的:
var regular_joe = 'regular_job is assigned'
function prison() {
//undefined regular_joe的声明会提升到函数的顶部,在查找全局作用域中的regular_joe之前会检查被提升的声明
//但是如果regular_joe当做参数传入函数,那么它在声明前就有值了
console.log(regular_joe)
var regular_joe
}
prison()
变量在声明前有值:
var regular_joe = 'regular_joe is assigned'
function prison( regular_joe ) {
//the regular_joe argument 在第一轮函数参数会被赋值
console.log( regular_joe )
var regular_joe
//the regular_joe argument 在第一轮函数参数会被赋值,上面的声明是多余的
console.log( regular_joe )
}
prison( 'the regular_joe argument' )