`
该用户名已经存在
  • 浏览: 306589 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javascript中函数及变量定义的提升

阅读更多
在Javascript中,函数及变量的声明都将被提升到函数的最顶部。
声明函数是将函数的声明以及定义都提升,函数表达式和变量表达式只是将函数或者变量的声明提升到函数顶部,而函数表达式和变量的初始化将不被提升,如果不弄清楚这个问题,很可能给您带来麻烦。
举例说明:
  
<html>
<head>
<title>函数提升</title>
<script language="javascript" type="text/javascript">
    
    //在全局对象中声明两个全局函数,反模式
    function foo()
    {
        alert("global foo");
    }
    
    function bar()
    {
        alert("global bar");
    }

    //定义全局变量
    var v = "global var";
    
    function hoistMe()
    {
        alert(typeof foo); //function
        alert(typeof bar); //undefined
        alert(v); //undefined

        //为什么bar函数和变量v是未定义而不是全局变量中定义的相应的函数变量呢?
         //因为函数里面定义了同名的函数和变量,无论在函数的任何位置定义这些函数和
         //和变量,它们都将被提升到函数的最顶部。
        
        foo(); //local foo
        bar(); //报错,缺少对象
        
        //函数声明,变量foo以及其实现被提升到hoistMe函数顶部
        function foo()
        {
            alert("local foo");
        }
        
        //函数表达式,仅变量bar被提升到函数顶部,实现没有被提升
        var bar = function()
        {
            alert("local bar");
        };

        
        //定义局部变量
         var v = "local";
    }
    
    (function()
    {
        hoistMe();
        
    })();
    
   //函数表达式和变量表达式只是其声明被提升,函数声明是函数的声明和实现都被提升。
    /**由于函数提升的效果,hoistMe方法相当于
    function hoistMe()
    {
        //函数声明,变量foo以及其实现被提升到hoistMe函数顶部
        function foo()
        {
            alert("local foo");
        }
        
         //函数表达式,仅变量bar被提升到函数顶部,实现没有被提升(同变量提升)
        var bar = undefined;
        
        //变量声明被提升
         var v = undefined;
        
        alert(typeof foo); //function
        alert(typeof bar); //undefined
        
        foo(); //local foo
        bar(); //报错,缺少对象
       
        bar = function()
        {
            alert("local bar");
        };
      
       v = "local";
        
    }
    */
</script>

</head>
<body>
</body>
</html>
0
0
分享到:
评论

相关推荐

    深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解

    1、JavaScript中定义函数有2钟方法:  1-1.函数声明: 代码如下:function funcName(arg1,arg2,arg3){ //函数体} ①name属性:可读取函数名。非标准,浏览器支持:FF、Chrome、safari、Opera。 ②函数声明提升:指...

    javascript中的变量作用域以及变量提升详细介绍

    当是,javascript有拥有函数级别的作用域,也就是说,在一个函数内定义的变量只能在函数内部访问或者这个函数内部的函数访问(闭包除外,这个我们过几天再写个专题)。 函数级别作用域的一个例子: 代码如下:var ...

    Agent-No-29#technical-summary#变量提升-代码运行1

    函数声明式会提升到作用域最前边函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升函数体中拥有的变量会优先使用,即:var name =

    JavaScript函数表达式详解及实例

    JavaScript函数表达式 一、序  定义函数的方式有两种:一种是函数声明,另一种就是函数表达式;  1.1 函数声明 function functionName(arg){ //函数体 }  关于函数声明,它有一个重要特征就是函数声明提升,...

    javascript中错误使用var造成undefined

    在javascript中根据变量作用的范围不同分为局部变量和全局变量,直接定义的变量是全局变量,全局变量可以被所有的脚本访问;在函数中定义的变量是局部变量,局部变量只在函数内有效。 如果全局变量和局部变量使用...

    JavaScript中变量提升机制示例详解

    JavaScript的变量提升有两种,用var声明的变量以及用function声明的变量。 用var声明的变量 我们先来看下面这段代码,a的值是多少 代码1 console.log(a); var a; 按照以往编程语言的思路来看,代码自上而下运行,...

    JavaScript应用开发实践指南

    第6章介绍编程所需变量、函数及循环知识。第7章介绍以事件处理实现用户交互的方法。第8章介绍如何通过Ajax与服务器通信。第9章介绍代码组织方式和风格,提升代码的高效率、可读性和可复用性。第10章介绍通过程序库更...

    js变量提升深入理解

    JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'Hello, ' + y; alert&#40;x&#41;; var y = 'Bob'; } foo(); 虽然...

    JavaScript王者归来part.1 总数2

     6.1.1.2 JavaScript函数的奥妙——魔法代码   6.1.2 函数的调用   6.2 函数的参数   6.2.1 形参与实参   6.2.2 Arguments对象   6.2.2.1 一个使用Arguments对象检测形参的例子   6.2.2.2 一个使用...

    JavaScript深入函数

    深入函数 函数介绍 函数是由事件驱动的或者当它被调用时...使用函数声明的函数在 JS 预解析时具有提升效果,在执行代码之前会先读取函数声明。 function 函数表达式 形式类似变量赋值语句,即创建一个函数并将它赋值给

    JS中作用域和变量提升(hoisting)的深入理解

    作用域(Scoping) ...c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当

    JavaScript 作用域scope简单汇总

    什么是作用域 程序的执行,离不开作用域,也必须在...在JavaScript变量提升的讨论中,我们其实是缺少了一个作用域的概念的,变量提升其实也是针对在同一作用域中的代码来说的。 对编译器的了解,让我们明白,对于一段

    浅谈JavaScript 声明提升

    1 引例及基本原理 在学习JavaScript声明提升之前,我们先看下面这个例子: console.log(a); var a=2; 运行结果会是什么?你可能会有以下的猜测: 1.报错ReferenceError: a is not defined; 2.打印2; 3.打印...

    es6新特性 学习word版2018最新

    let 定义的变量不会被变量提升,const 定义的常量不能被修改,let 和 const 都是块级作用域 ES6前,js 是没有块级作用域 {} 的概念的。(有函数作用域、全局作用域、eval作用域) ES6后,let 和 const 的出现...

    JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)

    就是作用域在一个“Function”里,属于这个函数的全部变量都可以在整个函数的范围内使用及复用。 function foo(a) { var b = 2; function bar() { // ... } var c = 3; } bar(); // 失败 console.log( a, b, c ); ...

    深入理解es6块级作用域的使用

    在JavaScript中使用var定义一个变量,无论是定义在全局作用域函数函数的局部作用域中,都会被提升到其作用域的顶部,这也是JavaScript定义变量的一个令人困惑的地方。由于es5没有像其它类C语言一样的块级作用域,因此...

    C++ Template 基础篇(一):函数模板详解

    C++是一门强类型语言,所以无法做到像动态语言(python javascript)那样子,编写一段通用的逻辑,可以把任意类型的变量传进去处理。泛型编程弥补了这个缺点,通过把通用逻辑设计为模板,摆脱了类型的限制,提供了...

    JavaScript ES6中const、let与var的对比详解

    变量提升:const 和 let 必须先声明再使用,不支持变量提升 console.log(c1, l1, v1); // 报错 // Uncaught ReferenceError: c1 is not defined const c1 = 'c1'; let l1 = 'l1'; var v1 = 'v1'; 作用域:const,...

Global site tag (gtag.js) - Google Analytics