声明提升

之前理解有一些错误,今天补过一下....

我们都知道 常用的函数写法有两种,一种是普通的函数声明,一种是使用变量初始化函数,他们两个最大的区别就是如果用变量初始化函数的声明方式,如果在声明前调用函数,是没有办法调用到的。

为什么会报 not a function(...)的错,我们都知道如果没有声明肯定会报not defined,如果声明了没有赋值会报undefined,如果一个非函数的变量在执行的时候用()执行,才会报not a function.

说明也许是()的过,那么去掉()呢

刚好印证了上面所说的,如果声明了没有赋值会报undefined,那么说明函数声明了,但没有赋值而已(把声明提前了),JavaScript中的变量提升时函数表达式中只会提升名称,函数体只有在执行到赋值语句时才会被赋值:

如果一个函数是这样写的

(function(){
    var a=‘One‘;
    var b=‘Two‘;
    var c=‘Three‘;
})() 

在执行时声明提前了,变成了这样

(function(){
    var a,b,c;
    a=‘One‘;
    b=‘Two‘;
    c=‘Three‘;
})() 

进一步证明

例1:

var v=‘Hello World‘;
alert(v);     //Hello World

var v=‘Hello World‘;
(function(){
alert(v);
})()           //Hello World

var v=‘Hello World‘;
(function(){
alert(v);
var v=‘I love you‘;
})()           //undefined

最后一个弹出undefined,因为声明提前了最后一个函数在执行时变成了

var v=‘Hello World‘;
(function(){
  var v;
  alert(v);
  v=‘I love you‘;
})() 

刚好符合之前说的,声明了但没有赋值,所以会弹出undefined

自我感觉特别绕的面试题例2:

var foo = 1;
function bar() {
  if (!foo) {
   var foo = 10;
  }
  alert(foo);
}
bar();     //10

一定感觉很奇怪,为什是10,其实如果把前面的var foo = 1; 去掉,也是10,说明是不是10和前面的全局变量没有关系,我们循序渐进

function bar() {
  if (true) {
   var foo = 10;
  }
  alert(foo);
}
bar()     //10

///////////////////////////////////////

function bar() {
  if (false) {
   var foo = 10;
  }
  alert(foo);
}
bar()     //undefined

说明在判断的时候,是true才能赋值,其实这里是提升了声明,变成了这样

var foo = 1;
function bar() {
  var foo;
  if (!foo) {
    foo = 10;
  }
  alert(foo);
}
bar();

回到最初所说的,只声明未赋值,弹出undefined,那么直接输出foo,肯定是undefined,!undefined得到true,so...就得到了我们看到的结果

补充两道题,和这个没多大关系

var a=1;
function test(){
   var a=3;
   return;
}
test()
a      //1
var a=1;
function test(){
  a=3;
  return;
}
test()
a    //3
var a = 1;
function b() {
  a = 10;
  return;
  function a() {}
   }
  b();
alert(a);         //1
				
时间: 2024-11-05 16:01:59

声明提升的相关文章

JavaScript 变量声明提升

JavaScript 变量声明提升 一.变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动 二.在基本的语句(或者说代码块)中(比如:if语句.for语句.while语句.switch语句.for...in语句等),不存在变量声明提升 三.函数声明会提升,但是函数表达式的函数体就不会提升 1 fun(); // hello 2 function fun(){ 3 console.log("hello"); 4 } 5 // -------------- 6 //

js变量声明提升

1.变量提升 根据javascript的运行机制和javascript没有块级作用域这个特点,可以得出,变量会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的. 变量声明提升至全局域 console.log(a); // undefined var a ="Hi"; 相当于 var a; // 变量提升到全局作用域 console.log(a); // 已声明变量a,但未初始化,固为undefined a="Hi"; 变量声明提升至当前函数域 v

javascript变量声明提升(hoisting)

javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = "hello"; (function(){   console.log(v);   var v = "world"; })(); 这段代码运行的结果是什么呢? 答案是:undefined 这段代码说明了两个问题, 第一,function作用域里的变量v遮盖了上层作用域变量v.代

第24天:js-函数变量声明提升

一.函数声明1.自定义函数function fun1(){ alert("我是自定义函数");}fun2();//函数不调用,自己不执行2.直接量声明var fun2=function(){ alert("直接量声明");}fun2();3.利用Function关键字声明var fun3=new Function("var a=10;b=20;alert(a+b)");fun3(); 二.变量声明提升如果在一个函数体内部声明了一个变量,不管这个变

深入理解变量声明提升和函数声明提升

变量声明提升 1.变量定义 可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined. 2.变量作用域 变量作用域指变量起作用的范围.变量分为全局变量和局部变量.全局变量在全局都拥有定义:而局部变量只能在函数内有效. 在函数体内,同名的局部变量或者参数的优先级会高于全局变量.也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖. 所有不使用var定义的变量都视为全局变量 3.函数作用域和声明提前 JavaScript的函数作用是指在函数内声

JavaScript作用域及作用域链详解、声明提升

相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局作用域.而只有函数可以创建局部作用域,像 if,for 或者 while 这种块语句是没办法创建作用域的. (当然 ES6 提供了 let 关键字可以创建块作用域.) Javascript 的这种特性导致 for 循环里面创建闭包时会产生让人意想不到的结果.比如下面这个例子: var i = 20;

[Effective JavaScript 笔记] 第12条:理解变量声明提升

js支持词法作用域,即除了极少的例外,对变量的引用会被绑定到声明变量最近的作用域中. js不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数. 不了解这个会产生一些微妙的bug. functon isWinner(palyer,others){ var highest=0; for(var i=0,n=others.length;i<n;i++){ var palyer=others[i]; if(player.score>highest){ highes

javascript变量声明提升

javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看一段代码 1 2 3 4 5 var v = "hello"; (function(){   console.log(v);   var v = "world"; })(); 这段代码运行的结果是什么呢?答案是:undefined这段代码说明了两个问题,第一,funct

11-变量声明提升和预解析

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> //预解析:js的解析器在页面加载的时候,首先检查页面上的语法错误.把变量声明提升起来. //变量值提升变量名,不提升变量值.而用function直接定义的

JavaScript基本概念(1)-声明提升

声明提升: function > var > other var提升的时候,只是声明提升,但是赋值还是会在原来的位置. Javascript Hoisting:In javascript, every variable declaration is hoisted to the top of its declaration context.我的理解就是在Javascript语言中,变量的声明(注意不包含变量初始化)会被提升(置顶)到声明所在的上下文,也就是说,在变量的作用域内,不管变量在何处声