美文网首页
js变量提升&函数名提升&函数内部变量提升

js变量提升&函数名提升&函数内部变量提升

作者: anjohnlv | 来源:发表于2019-04-18 13:54 被阅读0次
变量提升

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

console.log(a); // undefined
var a = 1;

等价于

var a;
console.log(a);
a = 1;

冷知识:let变量也会提升。但是不允许在赋值之前使用。比如:
let a = 1 { a = 2; let a; }会报错。如果没有提升,a=2应该将外面的a赋值为2。

函数名提升

同理

f(); // 1
function f() {
  console.log(1)
}

但是,如果采用赋值语句定义函数,JavaScript 就会报错。

f(); // Uncaught ReferenceError: fun is not defined
let f = function() {
  console.log(1)
}

此时,函数等价于

var f;
f();
f = function () {};

如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。

function f() {
  console.log(1);
}
f() // 2

function f() {
  console.log(2);
}
f() // 2

如果同时采用function命令和赋值语句声明同一个函数,最后总是采用赋值语句的定义。但是在赋值语句前采用的是function命令。

f() // 2
var f = function () {
  console.log('1');
}
f() // 1
function f() {
  console.log('2');
}
f() // 1
函数内部的变量提升

函数作用域内部也会产生“变量提升”现象。不管在什么位置命令声明的变量,变量声明都会被提升到函数体的头部。

function foo(x) {
  if (x > 100) {
    var tmp = x - 100;
  }
}

等价于

function foo(x) {
  var tmp;
  if (x > 100) {
    tmp = x - 100;
  };
}

注:let声明的变量同上文一样

相关文章

  • js变量提升&函数名提升&函数内部变量提升

    变量提升 JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的...

  • js3-函数变量提升 顶层函数 数据类型转换 Math对象 js

    函数变量的提升 函数内部变量提升: 函数内部使用变量, 默认情况下, 函数会把下面变量它的声明提升到函数的最上边 ...

  • JS中的提升

    JS中包含两种提升,变量提升和函数提升。 变量提升 变量提升只能是var或者function声明的变量或者函数,l...

  • 变量提升和函数声明提升

    JS引擎的工作方式:先解析代码,获取所有变量的声明。 变量提升 等价于 所以 等加于: 函数声明提升 当函数通过函...

  • Javascript 变量执行过程 和 数组 & 对象的区别

    变量提升 JS执行过程1. 先提升(先提升函数,再提升变量,如果名字一样,变量提升会覆盖函数提升)2. 再执行,如...

  • js 的变量提升和函数提升

    1. 深入理解 js 的变量提升和函数提升 先了解:js没有块级作用域,只有全局作用域,和函数作用域 相同的函数名...

  • 猫眼

    var变量提升,函数声明提升,消除变量声明提升(let); 高阶函数,函数式的编程,柯里化 原型链继承,js面向对...

  • js原生

    三种定义函数的方式 变量声明提升 在函数体内部,声明变量,会把该声明提升到函数体的最顶端。 只提升变量声明,不赋值...

  • JavaScript(一)---变量提升及其意义

    js中函数function及变量var的声明都将被提升到函数的最顶部。但是变量的初始化不会提升。 变量提升的原因 ...

  • function一些性质

    函数名的提升 JavaScript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量...

网友评论

      本文标题:js变量提升&函数名提升&函数内部变量提升

      本文链接:https://www.haomeiwen.com/subject/qljzwqtx.html