js变量,声明提升的坑

xiaoxiao2021-02-27  323

1、函数声明可以提升,所以foo()可以在上面执行。但是函数表达式不行

foo() // 3 function foo() { console.log(3) } fooNext() // Uncaught TypeError: fooNext is not a function var fooNext = function () { console.log(2) }

2、变量可以提升,但是赋值不能提升

未声明d时直接打印提示参数错误

console.log(d) // Uncaught ReferenceError: d is not defined

声明d但未赋值,

var d console.log(d) // undefined

声明d并赋值,在输出

var d = 3; console.log(d) // 3

先输出,在声明并赋值

console.log(d) // undefined 这里可不是参数错误提示。说明声明被提升了。但是赋值没有 var d = 3;

意想不到的问题1:

这个结果并不是2,首先在函数obj内,是可以访问到全局变量o的。但是由于函数内部声明了一个局部的同名变量o,由于变量被提升到执行环境顶端,所以console.log的执行落后于函数内部o的声明。

var o = 2; function obj() { console.log(o) var o; } obj(); // undefined // 由于声明提升,可以简单理解为等价于下面这样 function obj() { var o; console.log(o) }

意想不到的问题2:

这里有两个坑,一是块级作用域,而是变量提升,首先{}没有块级作用域,所以a被提升到全局环境最前面,所以a in window 是true,取反后为false所以不执行var赋值语句。

if (!('foo' in window)) { var foo = 1; } console.log(foo); // undefined

意想不到的问题3:

函数声明会覆盖变量声明,但不会覆盖变量赋值

function foo() { console.log(2); } var foo; console.log(foo); // foo(){console.log(2);} function foo() { console.log(2); } var foo = 3; console.log(foo); // 3
转载请注明原文地址: https://www.6miu.com/read-1711.html

最新回复(0)