JavaScript中的函数变量提升,是{}花括号内部全部代码的前移,函数内部的var a =1 也是被拆分成 var a ; a = 1的形式. 那么问题来了,要是函数内部有b=3 这样的没有var声明的变量,那么他变成全局变量之后,在执行顺序上会不会影响到,全局环境下的b呢? 答案是会,可能就是因为这样所以JavaScript实现代码的时候就用function使得{ }
若愚:: 在进入一个执行环境后,先把 var function声明前置,再去顺序执行代码,是var 声明在前 还是function声明在前?按照先来后到,同名覆盖原则!!! 但是如果一个变量已经有值,再var是无效的.当var 与 function同名 function有效
JavaScript引擎解释代码机制
JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行.这造成的结果就是所有的变量的声明语句,都会被提升到当前作用域的头部.
var 提升 和function提升不一样,var 会断开,function不会.
经典代码
console.log(a);
var a = 1;
var b = a;
console.log(b)
// 答案 undefined 1
var a = 1
function fn1(){
function fn2 (){
console.log(a)
}
var a = 2
return fn2
}
var fn = fn1()
fn() //2
变量的声明前置
用var创建变量,声明会前置
console.log(a)
var a=1
等同于
var a
console.log(a)
a=1
//输出 undefined,因为变量 a 的申明前置了,没有赋值就是 undefined
如果上面没用 var 声明变量,直接使用就是会报错
console.log(x)
x=1 // Uncaught ReferenceError: x is not defined
//因为变量 x 没有声明
函数的声明前置
用function声明函数,函数声明会前置
hello()
function hello() {
console.log('world')
}
//输出 world ,不会报错,因为 function 声明会前置
如果用函数表达式,则会报错
Hello()
var Hello = function() {
console.log('World')
}
// Uncaught TypeError: Hello is not a function
// 因为var构造函数表达式,函数的声明不会前置
// 调用一个没有声明的函数,就报错了
网友评论