1[JavaScript] 纯文本查看 复制代码 function func1 ( num ) {
console.log( num );
var num = 456;
console.log( num );
}
var num = 123;
func1( num );
//分析
//1. 进行预解析,观察声明有两个,一个函数声明func1,一个是变量声明var num
// func1被预解析记录,并与函数体相连
// var num 被记录
//2. 预解析结束,开始执行代码
// 执行第一句话为:num = 123,对num进行赋值
// 调用func1( num );
// 在进入函数体前,开辟函数内存需要的内存空间,将函数的参数var num = 123进行声明
// 进入函数体,开始执行预解析,观察到有个var num,重复声明,忽略
// 执行函数体,第一个console.log( num ) => 123
// num = 456,对num进行赋值
// 第二个console.log( num ) => 456
// 函数执行结束,回到外层
2
[JavaScript] 纯文本查看 复制代码 function func2 () {
console.log( num );
var num = 456;
console.log( num );
}
var num = 123;
func2( num );
//分析
//1. 进行预解析, 观察到有两个声明, func2和var num
// func2被记录,并与函数体相连
// var num被记录
//2. 预解析结束,开始执行代码
// 执行num = 123,对num进行赋值
// 调用func( num )
// 进入函数体,进行预解析, 记录var num
// 执行第一个console.log( num ) => undefined
// 执行赋值语句, num = 456
// 执行第二个console.log( num ) => 456
3
[JavaScript] 纯文本查看 复制代码 function func3 () {
console.log( num );
num = 456;
console.log( num );
}
var num = 123;
func3( num );
console.log( num );
//分析
//1. 进行预解析, 观察到有两个声明,func3和var num
// func3被记录,并与函数体相连
// var num被记录
//2. 预解析借宿,开始执行代码
// num = 123,进行赋值
// 调用func3( num )
// 进入函数体,进行预解析,无需要记录对象,预解析结束
// 执行第一个console.log( num ) => 此时函数的局部作用域内无num,向全局中找,全局num = 123 => 123
// num = 456,进行赋值操作 => 更改全局中的num = 456
// 执行第二个console.log( num ) => 456
// 函数执行完毕,执行第三个console.log( num ) => 456
|