标签: hoisting

需要了解Javascript函数提升示例

我读了Javascript Hoisting的概念.它让我感到很困惑,但是我看到了一些例子,并且知道吊装实际上是做什么的.

所以基本上" 提升是JavaScript将所有声明移动到当前范围顶部(到当前脚本或当前函数的顶部)的默认行为. "

但我无法理解以下实施:

var is_android = true;
if (is_android) {
    function foo() {
        alert('I am Android');
    }
} else {
    function foo() {
        alert('I am NOT Android');
    }
}
foo();
Run Code Online (Sandbox Code Playgroud)

输出在警告框中显示" 我不是Android ".

我想知道为什么foo()从else块调用,即使is_android值为true.

任何帮助将不胜感激.

javascript function hoisting

23
推荐指数
2
解决办法
1287
查看次数

为什么变量定义的全局未定义?

嗨,大家好,我有一个简单的函数和一个全局变量.

为什么myname undefined不是字符串"global"

var myname = "global"; // global variable
function func() {
    alert(myname); // "undefined"
    var myname = "local";
    alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)

是不是可以引用在该函数范围之外定义的外部变量?在这个全局变量......

我如何解决这个问题,以便undefined从全局变量中得到一个?

javascript global-variables local-variables hoisting

20
推荐指数
1
解决办法
3万
查看次数

当JavaScript变量名称和函数名称相同时会发生什么?

我有以下代码,我在其中声明一个函数,然后是一个与函数同名的变量:

function a(x) {
    return x * 2;
}

var a;
alert(a);
Run Code Online (Sandbox Code Playgroud)

我希望这能提醒undefined,但如果我运行它,警报将显示以下内容:

函数a(x){
    return x*2
}

如果我为变量赋值(如var a = 4),则警报将显示该值(4),但如果没有此更改,a则会将其识别为函数.

为什么会这样?

javascript scope function hoisting name-binding

20
推荐指数
2
解决办法
8903
查看次数

const和让IIFE模式不必要吗?

据我了解,IIFE模式是一个解决ES5及以下无法创建块范围的事实.通过将所有内容包装在函数中并立即调用它,我们可以创建一个范围.

现在,let并且const将获得更多浏览器的支持,这是否减少了对IIFE模式之类的需求?

javascript scope hoisting ecmascript-6

19
推荐指数
1
解决办法
2601
查看次数

在clojure中缺乏"吊装"

我发现有几次我有一组相互关联的函数,我怎么自然地将它们放在文件中最终与它们的依赖项冲突(即函数1依赖于函数2,但是在函数1之上).当我编写代码时,我通常会继续评估顶级表达式,并且只会评估整个文件以刷新refs或诸如此类的依赖关系.我经常发现,我最终会遇到依赖冲突,并最终不得不兼顾一堆函数.

在其他语言中,我知道,只要你声明一个函数,它就会在幕后"悬挂",好像它出现在其他任何东西之前.这样您就不必担心代码中的事物顺序,并且可以将函数视为代码的模块化位.缺乏这个功能让我一直在咬我.难道我做错了什么?它是一个小麻烦然后是一个巨大的交易,这是你只是习惯于注意的东西?

clojure hoisting

16
推荐指数
1
解决办法
498
查看次数

在Chrome和Firefox中使用Javascript吊装

在Chrome和Firefox中运行此功能会给出不同的答案:

(function() {

        if(true) {
            function f() { alert("yes"); };
        } else {
            function f() { alert("no"); };
        }
        f();

    })();
Run Code Online (Sandbox Code Playgroud)

在Chrome中,结果是'不'在Firefox中,结果为'是'

为什么不同?

javascript firefox google-chrome hoisting

11
推荐指数
2
解决办法
977
查看次数

为什么必须在文件的底部声明模块的导出?

我有以下编辑代码:

module.exports = {
  read: read,
  write: write,
};

var read = function(parameters, config, next) {
  /* <snip> */
};

var write = function(parameters, config, next) {
  /* <snip> */
};
Run Code Online (Sandbox Code Playgroud)

如果我在require()别处转到此文件,它将崩溃节点并说所需的对象没有方法readwrite.变量提升不会拉动上面的功能modules.export = { ... };吗?

node.js hoisting

10
推荐指数
1
解决办法
2899
查看次数

在JavaScript中提升的顺序

function g () {
    var x;
    function y () {};
    var z;
}
Run Code Online (Sandbox Code Playgroud)

我想知道上面的代码在提升时的确切顺序.

理论1:var s和functions 之间的顺序保持原样:

function g () {
    var x;
    function y () {};
    var z;
}
Run Code Online (Sandbox Code Playgroud)

理论2: var先到functions:

function g () {
    var x;
    var z;
    function y () {};
}
Run Code Online (Sandbox Code Playgroud)

理论3: function先到vars:

function g () {
    function y () {};
    var x;
    var z;
}
Run Code Online (Sandbox Code Playgroud)

哪种理论是正确的?

javascript hoisting

10
推荐指数
2
解决办法
1819
查看次数

const变量没有为立即调用的函数提升

我正在玩新的ECMASCRIPT-6 const关键词.我不明白关键字的一个特定行为.

可以说我有两个功能

第一个案例

(function(){
  console.log(_t); 
  const _t=10;
})();
Run Code Online (Sandbox Code Playgroud)

第二个案例

function t(){
  console.log(_y); 
  const _y=11;
}
t();
Run Code Online (Sandbox Code Playgroud)

对于第一种情况,输出是(不明白为什么)

ReferenceError:在初始化之前无法访问词法声明`_t'

对于第二种情况,输出是(罚款)

未定义

第二种情况输出是预期的,但我不知道为什么第一种情况结果会引发错误.可以从错误中推断出变量没有被提升.但为什么?我发现这里const使用块范围.这个范围有什么关系吗?

我正在使用Firefox Developer Version控制台来运行测试.

javascript scope const hoisting ecmascript-6

10
推荐指数
1
解决办法
1250
查看次数

功能和可变提升的意外结果

我正在读"你不懂JS"系列的第二本书,我读过在变量之前函数被提升了.

所以这是代码:

foo(); // 1

var foo;

function foo() {
    console.log( 1 );
}

foo = function() {
    console.log( 2 );
};
Run Code Online (Sandbox Code Playgroud)

这个输出将是1.但为什么呢?首先提升函数,然后提升变量.因此,在我的函数foo(打印1的那个)被提升之后,它必须跟随变量foo.所以结果应该是"未定义"而不是"1".

我希望代码的行为就像它一样:

// hoisted first
function foo() {
    console.log( 1 );
}

// hoisted second
var foo;  // implicitly initialized to 'undefined'

foo();  // call 'undefined' - error?

foo = function() {
    console.log( 2 );
};
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

javascript hoisting

9
推荐指数
1
解决办法
237
查看次数