Una

接下来的日子,陆续把未总结的问题补充起来......

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、函数声明变量提升

  函数声明具有变量提升的问题,所以在函数被声明之前就可以访问。

console.log(getValue()); 
function getValue() { 
     return 'a'; 
}

 需要注意的是现在可以在普通块内部定义函数,不会有变量提升,因为是在执行的时候,才会有函数声明。

//将方法赋值给一个变量,方法就不会被重写,因此才能得到正确的结果。
function functions(flag) {
    if (flag) {
      function getValue() { return 'a'; }
    } else {
      function getValue() { return 'b'; }
    }

    return getValue();
}
console.log( functions(true) );//a

  

getValue();  //getValue is not a function 
var flag = true; 
if (flag) {
      function getValue() { return 'a'; }
} else {
      function getValue() { return 'b'; }
}

  

改成函数表达式的形式如下:

function functions(flag) {
    if (flag) {
      var getValue =  function () {
      	return 'a'; 
      }
    } else {
     var getValue = function () { 
      	return 'b'; 
      }
    }

    return getValue();
}
console.log( functions(true) );//a

 2017-2-7更:

 函数声明提升优先级大于变量声明提升优先级:

    

 函数表达式没有变量提升的过程:

foo();             
bar();           
var foo=function bar(){
    console.log("111");
}

 

 函数表达式等号后面必须为匿名函数,写成上述形式默认等号后面为匿名函数,所以bar找不到,同时函数表达式没有提升的过程所以无法在函数定义之前访问。

 

二、var定义的变量,变量提升的问题

判断window对象中是否函数a1变量,var定义的变量会有变量提升,所以a1实质上是在全局环境中。

if(!("a1" in window)){
    var a1 = 222;
}
alert(a1);//undefined

 2017-2-7更:

(function(){
 a = 5;
 alert(window.a);
 var a = 10;
 alert(a); 
})();

 a是在函数中的一个变量,属于局部变量,全局变量中没有a。

 输出结果: undefined 10

 

hello函数中的t没有通过var来定义,被提升到hello函数外面,覆盖了前面定义的t。

 

2017-10-6更:

console.log(a);
var a = 88; 
var a = function() {
console.log(22);
}

console.log(a);
function a() {
console.log(222);
}

console.log(a);

  

 

posted on 2016-12-19 09:58  youyi2016  阅读(237)  评论(0编辑  收藏  举报