Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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_Hoisting - Fatal编程技术网

编写函数的不同方法会在JavaScript中产生不想要的效果?

编写函数的不同方法会在JavaScript中产生不想要的效果?,javascript,scope,hoisting,Javascript,Scope,Hoisting,更新: 问题解决了我意识到这是因为“提升”。基本上,JavaScript解释器在函数开始时解析代码并声明所有变量(但不初始化它们)。这就是第二个例子不起作用的原因。因为JavaScript解释器声明var已更改在函数的开头,但在函数到达代码体之前,不会初始化它 对于函数声明(如第一个示例所示),它没有像第二个示例那样只向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它工作的原因 无论如何,我写这篇文章是为了个人参考,谢谢你的回答 这个有效: 但是这个没有: 为什么?后者

更新:

问题解决了我意识到这是因为“提升”。基本上,JavaScript解释器在函数开始时解析代码并声明所有变量(但不初始化它们)。这就是第二个例子不起作用的原因。因为JavaScript解释器声明
var已更改
在函数的开头,但在函数到达代码体之前,不会初始化它

对于函数声明(如第一个示例所示),它没有像第二个示例那样只向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它工作的原因

无论如何,我写这篇文章是为了个人参考,谢谢你的回答


这个有效:

但是这个没有:


为什么?

后者相当于:

$(function(){
  var changed;
  $name = $('#test');
  $name.change(changed);

  changed = function(e){
      //...
    };
});
这就清楚了为什么它不起作用。使用时,
更改的
变量尚未初始化(
未定义的

但是,如果您使用
函数yourFunctionName()
语法声明一个函数,它在整个范围内都是可用的。(在JavaScript中,它是父函数)否则就不可能在函数声明之前使用它们。这叫吊装

另见:

后一种方法相当于:

$(function(){
  var changed;
  $name = $('#test');
  $name.change(changed);

  changed = function(e){
      //...
    };
});
这就清楚了为什么它不起作用。使用时,
更改的
变量尚未初始化(
未定义的

但是,如果您使用
函数yourFunctionName()
语法声明一个函数,它在整个范围内都是可用的。(在JavaScript中,它是父函数)否则就不可能在函数声明之前使用它们。这叫吊装

另见:

    • 因为变量是在使用后定义的。

      var a = 1;
      var c = a + b;
      var b = 2;
      

      您不会期望该代码运行。

      因为变量是在使用之后定义的。

      var a = 1;
      var c = a + b;
      var b = 2;
      

      您不会期望该代码运行。

      第一个代码在作用域中定义了一个函数。第二个函数创建一个内联函数,并将对它的引用存储在局部变量
      changed
      中。问题是在使用变量后填充它

      这将有助于:

      $(function(){
        var changed = function(e){
            console.log('e: ', e); 
            console.log('e.currentTarget: ', e.currentTarget); 
            console.log('$(e.currentTarget).val(): ', $(e.currentTarget).val());
            $('#test-display').text($(e.currentTarget).val());
        };
      
        $name = $('#test');
        $name.change(changed);
      });
      

      第一个定义了作用域中的函数。第二个函数创建一个内联函数,并将对它的引用存储在局部变量
      changed
      中。问题是在使用变量后填充它

      这将有助于:

      $(function(){
        var changed = function(e){
            console.log('e: ', e); 
            console.log('e.currentTarget: ', e.currentTarget); 
            console.log('$(e.currentTarget).val(): ', $(e.currentTarget).val());
            $('#test-display').text($(e.currentTarget).val());
        };
      
        $name = $('#test');
        $name.change(changed);
      });
      

      @Farmor不是空的,而是未定义的。@TomaszNurkiewicz:非常欢迎您-我一直在努力区分JavaScript中创建函数的两种方法,您在这里对提升的解释帮助我进一步理解了这一点。我只是想为像我这样的迟钝的大脑添加一些明确的细节。@Farmor不是空的,而是未定义的。@TomaszNurkiewicz:不客气,我在努力区分JavaScript中创建函数的两种方法,你在这里对提升的解释帮助我进一步理解了它。我只是想为像我这样的慢大脑添加一些明确的细节。