Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript函数范围和提升_Javascript_Scope_Scoping_Hoisting - Fatal编程技术网

Javascript函数范围和提升

Javascript函数范围和提升,javascript,scope,scoping,hoisting,Javascript,Scope,Scoping,Hoisting,我刚刚读了一篇关于他的好文章,他在文章中举了以下例子: var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 使用上述代码,浏览器将提示“1” 我仍然不确定它为什么返回“1”。他说的一些话让我想起: 所有的功能声明都被提升到顶部。可以使用函数限定变量的作用域。还是不适合我 您必须记住的是,它在执行之前解析整个函数并解析所有变量声明。所以 function a() {}

我刚刚读了一篇关于他的好文章,他在文章中举了以下例子:

var a = 1;

function b() {
    a = 10;
    return;

    function a() {}
}
b();
alert(a);
使用上述代码,浏览器将提示“1”

我仍然不确定它为什么返回“1”。他说的一些话让我想起:
所有的功能声明都被提升到顶部。可以使用函数限定变量的作用域。还是不适合我

您必须记住的是,它在执行之前解析整个函数并解析所有变量声明。所以

function a() {} 
真的变得

var a = function () {}

var a
强制它进入局部作用域,变量作用域贯穿整个函数,因此全局a变量仍然是1,因为您已通过将a作为函数声明为局部作用域

您必须记住的是,它在执行之前解析整个函数并解析所有变量声明。所以

function a() {} 
真的变得

var a = function () {}
var a
强制它进入局部作用域,变量作用域贯穿整个函数,因此全局a变量仍然是1,因为您已通过将a作为函数声明为局部作用域

函数a(){}
是一个函数语句,它创建一个
a
变量,该变量位于
b
函数的局部。
解析函数时会创建变量,而不管是执行
var
还是函数语句

a=10
设置此局部变量。

函数a(){}
是一个函数语句,它创建一个
a
变量,该变量位于
b
函数的局部。
解析函数时会创建变量,而不管是执行
var
还是函数语句


a=10
设置此局部变量。

函数
a
在函数
b
内提升:

var a = 1; 
function b() { 
   function a() {} 
   a = 10; 
   return;
} 
b(); 
alert(a);
这几乎就像使用
var

var a = 1; 
function b() { 
   var a = function () {};
   a = 10; 
   return;
} 
b(); 
alert(a);

函数是本地声明的,设置
a
仅在本地范围内发生,而不是全局变量。

函数
a
在函数
b
内提升:

var a = 1; 
function b() { 
   function a() {} 
   a = 10; 
   return;
} 
b(); 
alert(a);
这几乎就像使用
var

var a = 1; 
function b() { 
   var a = function () {};
   a = 10; 
   return;
} 
b(); 
alert(a);

函数是在本地声明的,设置
a
仅在本地范围内发生,而不是在全局变量中发生。

函数提升意味着函数被移动到其范围的顶部。就是

function b() {  
   a = 10;  
   return;  
   function a() {} 
} 
将被interpeter改写为

function b() {
  function a() {}
  a = 10;
  return;
}
奇怪吧

而且在这个情况下,

function a() {}
表现与

var a = function () {};

因此,本质上,代码就是这样做的:

var a = 1;                 //defines "a" in global scope
function b() {  
   var a = function () {}; //defines "a" in local scope 
   a = 10;                 //overwrites local variable "a"
   return;      
}       
b();       
alert(a);                 //alerts global variable "a"

功能提升是指将功能移动到其范围的顶部。就是

function b() {  
   a = 10;  
   return;  
   function a() {} 
} 
将被interpeter改写为

function b() {
  function a() {}
  a = 10;
  return;
}
奇怪吧

而且在这个情况下,

function a() {}
表现与

var a = function () {};

因此,本质上,代码就是这样做的:

var a = 1;                 //defines "a" in global scope
function b() {  
   var a = function () {}; //defines "a" in local scope 
   a = 10;                 //overwrites local variable "a"
   return;      
}       
b();       
alert(a);                 //alerts global variable "a"
  • 函数声明
    function a(){}
    首先被提升,其行为类似于
    var a=function(){},因此在本地范围
    中创建了一个
    
    
  • 若有两个同名变量(一个在全局变量中,另一个在局部变量中),则局部变量始终优先于全局变量
  • 设置
    a=10
    时,设置的是局部变量
    a
    ,而不是全局变量
  • 因此,全局变量的值保持不变,您会收到警报1

  • 函数声明
    function a(){}
    首先被提升,其行为类似于
    var a=function(){},因此在本地范围
    中创建了一个
    
    
  • 若有两个同名变量(一个在全局变量中,另一个在局部变量中),则局部变量始终优先于全局变量
  • 设置
    a=10
    时,设置的是局部变量
    a
    ,而不是全局变量

  • 因此,全局变量的值保持不变,您会收到警报1,因为变量名与函数名的意思是“a”相同。 因此,由于Javascript的原因,它尝试解决命名冲突,它将返回a=1

    在我读到这篇关于“JavaScript提升”的文章之前,我对此也感到困惑


    希望能有所帮助。

    之所以发生这种情况,是因为变量名与函数名的意思是“a”相同。 因此,由于Javascript的原因,它尝试解决命名冲突,它将返回a=1

    在我读到这篇关于“JavaScript提升”的文章之前,我对此也感到困惑


    希望能有所帮助。

    提升是一个让我们更容易理解的概念。实际发生的是声明首先针对其作用域进行,然后赋值(而不是同时进行)

    当声明发生时,
    var a
    ,然后
    function b
    ,在该
    b
    范围内,声明
    function a

    此函数a将对来自全局范围的变量a进行阴影处理

    声明完成后,将开始赋值,全局
    a
    将获得值
    1
    ,函数b
    中的a将获得
    10
    。 执行
    警报(a)
    时,它将调用实际的全局范围变量。 对代码的这一小改动将使其更加清晰

            var a = 1;
    
        function b() {
            a = 10;
            return a;
    
            function a() { }
        }
    
        alert(b());
        alert(a);
    

    提升是一个让我们更容易理解的概念。实际发生的是声明首先针对其作用域进行,然后赋值(而不是同时进行)

    当声明发生时,
    var a
    ,然后
    function b
    ,在该
    b
    范围内,声明
    function a

    此函数a将对来自全局范围的变量a进行阴影处理

    声明完成后,将开始赋值,全局
    a
    将获得值
    1
    ,函数b
    中的a将获得
    10
    。 当您执行
    警报(a)
    时,它将
      function foo() {
         console.log(x)
         var x = 1;
     }
    
      function foo() {
         var x;
         console.log(x)
         x = 1;
      }
    
      function foo() {
         if (false) {
             var a = 1;
         }
         return;
         var b = 1;
      }
    
      function foo() {
          var a, b;
          if (false) {
            a = 1;
         }
         return;
         b = 1;
      }
    
     function demo() {
         foo(); // this will give error because it is variable hoisting
         bar(); // "this will run!" as it is function hoisting
         var foo = function () {
             alert("this would not run!!");
         }
         function bar() { 
             alert("this will run!!");
         }
     }
     demo();
    
    var a = 1;
    function b() {
      a = 10;
      return;
       function a() {}
    }
    b();
    alert(a);
    
    var a = 1;                 //defines "a" in global scope
     function b() {  
       var a = function () {}; //defines "a" in local scope 
        a = 10;                 //overwrites local variable "a"
        return;      
     }       
     b();       
     alert(a); 
    
    function a(){
      function b(){
        console.log(myVar);
      }
    
      var myVar = 2;
      b();
    }
    
    var myVar = 1;
    a();
    b();
    > 2
    > Uncaught ReferenceError: b is not defined
    
    function a(){
      function b(){
        console.log(myVar);
      }
    
      b();
    }
    
    var myVar = 1;
    a();
    > 1
    
    a = 7;
    var a;
    console.log(a) 
    
    var a;
    a = 7;
    console.log(a);
    // 7
    
    console.log(square(7)); // Output: 49
    function square(n) { return n * n; }
    
    function square(n) { return n * n; }
    console.log(square(7)); // 49
    
    console.log(x);
    var x = 7; // undefined
    
    var x;
    console.log(x); // undefined
    x = 7;
    
     var v;
     console.log(v);
     console.log(abc);
    /*
    The output of the above codes are:
    undefined
    ReferenceError: abc is not defined*/
    
    <script>
    var totalAmo = 8;
    var getSum = function(a, b){
          return a+b;
    }
    </script>
    
    console.log(totalAmo);
    console.log(getSum(8,9));
    var totalAmo = 8;
    var getSum = function(a, b){
          return a+b;
    }
    console.log(totalAmo);
    console.log(getSum(9,7));
    
     <script>
            var totalAmo;
            var getSum;
    
            console.log(totalAmo);
            console.log(getSum(8,9));
            var totalAmo = 8;
            var getSum = function(a, b){
                return a+b;
            }
            console.log(totalAmo);
            console.log(getSum(9,7));
        </script>
    
    console.log(getId());
    function getId(){
       return 739373;
    }
    /* output: 739373, because the whole function hoisted on the top of the scope.*/
    
    function functionScope(){
                var totalAmo;
                var getSum;
    
                console.log(totalAmo);
                console.log(getSum(8,9));
                var totalAmo = 8;
                var getSum = function(a, b){
                    return a+b;
                }
            }
    
     function getTotal(){
                let total=0;
                for(var i = 0; i<10; i++){
                    let valueToAdd = i;
                    var multiplier = 2;
                    total += valueToAdd*multiplier;
                }
                return total;
            }
    
     function getTotal(){
                let total;
                var multiplier;
                total = 0;
                for(var i = 0; i<10; i++){
                    let valueToAdd;
                    valueToAdd = i;
                    multiplier = 2;
                    total += valueToAdd*multiplier;
                }
                return total;
            }