资讯专栏INFORMATION COLUMN

js 变量、函数声明提前问题

Benedict Evans / 1098人阅读

摘要:变量声明提前看代码以上代码报错,这很好理解根本就没声明当然报错啦,往下看以上代码对于解释器来说是下面这样的,所以没有报错,且输出了再来看一中情况原因如下对于解释器来代码是这样的向上首先找到局部变量函数提前以上代码中函数不只是声明提前了而是整

1、变量声明提前:
看代码

(function(){

    function add(){
        alert(a);
    }
})()
/* 以上代码报错:ReferenceError: a is not defined,
 * 这很好理解 根本就没声明当然报错啦,往下看:
 */

(function(){

    function add(){
        alert(a); // output:undefined;
        var a = "bcd";
        alert(a); // output:bcd;
    }
    
})()
//以上代码对于解释器来说是下面这样的,所以没有报错,且输出了undefined;


(function(){
    
    function add(){
        var a; // eq: var a = undefined;
        alert(a); // output:undefined;
        a = "bcd";
        alert(a); // output:bcd;
    }
    
})()

//再来看一中情况:
(function(){

    var a = "wer";
    function add(){
        alert(a); // output:undefined;
        var a = "bcd";
        alert(a); // output:bcd;
    }
    
})()
/*
 *原因如下:对于解释器来代码是这样的
 */
(function(){

    var a = "wer";
    function add(){
        var a; // eq:var a = undefined;
        alert(a); // 向上首先找到局部变量a,
        a = "bcd";
        alert(a);
    }
    
})()

2、函数提前:

(function(){
    
    alert(add(1, 3)); // output:4, 

    function add(x, y){
        return x + y;
    }
    
})
// 以上代码中函数add 不只是声明提前了而是整个add函数的定义都被提前了

//另一种情况:
(function(){

    alert(add(1, 3)); //TypeError: add is not a function

    var add = function(x, y){
        return x + y;
    }
    
})()

//对于编译器来说代码如下:
(function(){
    
    var add;

    alert(add(1, 3)); //所以TypeError
    
    add = function(x, y){
        return x + y;
    }
    
})()
**总结:**
1、变量的声明被提前到作用域顶部,赋值保留在原地
2、函数声明整个“被提前”
3、函数作为值赋给变量时只有变量“被提前”了,函数没有“被提前”

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79817.html

相关文章

  • JS难点之hoist

    摘要:但是变量只有其声明被提前在作用域的最开始处,赋值结果仍然还在原来位置。 这篇博文是之前在CSDN写的,现在移至sf。 有过C或者Java类编程经验的同学,对于先声明后使用的规则很熟悉,如果使用未声明的变量或者函数,编译时程序会报错!但是,JavaScript却是一个‘大奇葩’,可以在变量或者函数声明之前使用,现在根据我的理解在做一下说明。 首先说明JS的hoist分为变量hoist和函...

    biaoxiaoduan 评论0 收藏0
  • Javascript 函数、作用域链与闭包

    摘要:而外层的函数不能访问内层的变量或函数,这样的层层嵌套就形成了作用域链。闭包闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量。 闭包是js中一个极为NB的武器,但也不折不扣的成了初学者的难点。因为学好闭包就要学好作用域,正确理解作用域链,然而想做到这一点就要深入的理解函数,所以我们从函数说起。 函数...

    ssshooter 评论0 收藏0
  • js几个经典的题目详解

    摘要:四这个题目比较简单即函数声明和变量声明的关系和影响,遇到同名的函数声明,不会重新定义五关于这个题目,的规范有解释的。属性的值是对象关于对象的具体定义,看这里对象六这个题目可以说是最简单的,也是最诡异的关于这个题目,我们先来了解个概念。 废话不多说,直接看题目,先不要急着看答案 先自己思考,收获更多 (长期补仓); 一 var out = 25, inner = { ...

    stormgens 评论0 收藏0
  • JS基础-作用域、作用域链与闭包 Part three

    摘要:作用域执行上下文变量提前函数声明提前确定值范围一段或者一个函数都会生成一个执行上下文全局一段变量定义函数声明函数变量定义函数声明参数集合变量提前代码解析执行过程变量定义提前赋值函数声明提前代码解析函数声明函数表达式执行过程执行过程执行时才能 1.作用域 执行上下文 (变量提前、函数声明提前、确定this值、arguments) 范围:一段或者一个函数(都会生成一个执行上下文) ...

    heartFollower 评论0 收藏0
  • js知识梳理5:关于函数的要点梳理(1)

    摘要:构造函数调用会使用新创建的对象作为调用上下文。函数的参数相关可选形参当传入的实参比函数声明时指定的形参数量要少,剩下的形参都将设置为值实参多则会自动省略。它们的第一个实参是要调用函数的母对象,它是调用上下文,函数体内通过引用它。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,感谢它们的...

    付伦 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<