0
点赞
收藏
分享

微信扫一扫

JavaScript的变量和作用域


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' )




举报

相关推荐

0 条评论