js作用域和变量提升

Function declarations and variable declarations are always moved (“hoisted”) invisibly to the top of their containing scope by the JavaScript interpreter.

example1 :

    var foo = 1;
    function bar() {
      if (!foo) {
        var foo = 10;
      }
      console.log(foo); // 10
    }
    bar();

example2 :

    var a = 1;
    function b() {
      a = 10;
      return;
      function a() { }
    }
    b();
    console.log(a); // 1

example3 :

    var x = 1;
    console.log(x); // 1
    if (true) {
      var x = 2;
      console.log(x); // 2
    }
    console.log(x); // 2

example4:

  function foo() {
      var x = 1;
      if (x) {
        (function () {
          var x = 2;
          // some other code
        } ());
      }
      // x is still 1.
    }

Named Function Expressions

You can give names to functions defined in function expressions, with syntax like a function declaration. This does not make it a function declaration, and the name is not brought into scope, nor is the body hoisted. Here’s some code to illustrate what I mean:

example 5:

    foo(); // TypeError "foo is not a function"
    bar(); // valid
    baz(); // TypeError "baz is not a function"
    spam(); // ReferenceError "spam is not defined"

    var foo = function () { }; // anonymous function expression (‘foo‘ gets hoisted)
    function bar() { }; // function declaration (‘bar‘ and the function body get hoisted)
    var baz = function spam() { }; // named function expression (only ‘baz‘ gets hoisted)

    foo(); // valid
    bar(); // valid
    baz(); // valid
    spam(); // ReferenceError "spam is not defined"

example 6:

   getName(); //5
    var getName = function () { console.log(4); };
    function getName() { console.log(5); };
    getName();//4

example 7:

    function Foo() {
      getName = function () { console.log(1); };
      return this;
    }
    Foo.getName = function () { console.log(2); };
    Foo.prototype.getName = function () { console.log(3); };
    var getName = function () { console.log(4); };
    function getName() { console.log(5); };

    Foo.getName(); //2
    getName(); //4
    Foo().getName(); //1
    getName(); //1
    new Foo.getName(); //2
    new Foo().getName(); //3
    new new Foo().getName(); //3
时间: 2024-12-28 02:03:28

js作用域和变量提升的相关文章

js 作用域,变量提升

先看下面一段代码: 1 var a = 0; 2 alert("1st alert : a = " + a); 3 function fun(){ 4 alert("2nd alert : a = " + a); 5 var a = 1; 6 setTimeout(function(){ 7 alert("3rd alert : a = " + a); 8 a = 2; 9 },1000); 10 a = 3; 11 setTimeout(fun

Javascript作用域和变量提升

下面的程序是什么结果? [javascript] view plain copy var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? [javascript] view plain copy var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 结果是1. 吓你一跳

作用域与变量提升的面试题方法总结

前言:下面的方法能快速的解面试题,主要针对=>作用域与变量提升的面试题.并且没有this改变指向的情况 (有错或者不足的地方,随时修改补充) 1.没有参数的时候:看有没有var,或者函数申明(也就是说如果有变量提升,函数体内就变成私有变量了,函数体内修改了不会影响父级.) 有,子集是undefined,也不会找父级,下面修改了(简单和复合类型)都不会影响父级. 没有,子集找不到,会找到父级,下面修改了(简单和复合类型)都会影响父级. 2.有参数的时候:(有传参,函数体内就变成私有变量了,函数体内

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

作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级

关于JS里面的变量提升

之前和一个同事做一个项目的时候遇到了一个变量提升的问题,明明已经定义了但是会弹出undefined.后来查了一下,因为是变量提升的原因才导致的. var V="Hello World"; (function(){ alert(V); var V="111" })() 这个时候你会弹出一个undefined,按照我们本来的思路应该是弹出一个Hello World或者111,和undefined是完成不沾边的. 当我们把函数改成这个样子的时候 var V="H

js中的变量提升与函数提升

先看看一个简单的代码 var str='Hello World'; alert(str);//弹出 Hello World 再看一段代码: var v='Hello World'; (function(){ alert(v); })() //和我们预期的一样,还是弹出 Hello World 那么铺垫完了,继续coding var str='Hello World'; (function(){ alert(str); var str='I love coding...'; })() //出乎我们

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

1在js中只有两种作用域 a:全局作用域 b:函数作用域 在ES6之前,js是没有块级作用域. 首先来解释一下什么是没有块级作用域? 所以此时 是可以打印输出变量a的值. 2:什么是变量提升? 在我们的js中,代码的执行时分两步走的,1.解析 2.一步一步执行 那么变量提升就是变量声明会被提升到作用域的最顶上去,也就是该变量不管是在作用域的哪个地方声明的,都会提升到作作用域的最顶上去. 那么上面这种写法其实等价于下面这种写法: 看几个例子: 把上面的例子稍作改动: 结果就会大不一样, 再看一个例

作用域、变量提升、函数提升、数据类型

一.作用域分类 (作用域范围内定义的变量,整个作用域都可以访问) 1. 全局作用域 使用var声明(或者不严格模式下没有声明)且在函数外定义的变量,其作用域范围是全局的,称其为全局作用域. 2. 函数作用域 使用var声明且在函数内部定义的变量,其作用域范围是整个函数,称其为函数作用域. 3. 块作用域(ES6) 使用let(或者const 常量)声明且在一个花括号(非函数)里面,其作用域范围就是这个花括号以内,称其为块作用域. 二.变量提升 (变量声明会提升至函数或者语句的最前面,位置还在其作

javas基础03——函数的作用域及变量提升

1.作用域 作用域,变量在函数内部作用的范围/区域.有函数的地方就有作用域. 2.局部作用域和全局作用域 function fn(){ var a = 1; } console.log(a); //报错:a is not defined 用var声明的变量,实际上是有作用域的 在函数内部定义的变量,该变量的作用域是整个函数体,在函数体外不可引用该变量,这是局部作用域 变量的生命周期: 1.永远存在----全局 程序没关,一直占用内存,少用全局 2.朝生暮死----局部 函数的大括号开头到函数的大