一小段js代码的困惑,有关变量提升的问题

发布于 2022-09-11 20:45:28 字数 706 浏览 16 评论 0

<script>


f = function () {
    return true;
};
g = function () {
    return true;
};

(function () {
    if (g() && []==![]){ //12行
        f=function f(){return false;};
        function g(){return true;}
    }
})();//16行


alert(g());
alert(f());
</script>

执行结果如下

clipboard.png

function g(){return true;}

这句理论上属于函数声明,应该会变量提升才对,12行为什么会产生g()不是函数的错误呢?

另外:最后的alert(g());
这句话和闭包中定义的function g(){return true;}有没有关系啊?

最后,闭包中f=function f(){return false;};这个f和外边的f有关系吗?
希望各位不吝赐教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

寄风 2022-09-18 20:45:28
  1. 声明提升,赋值又不会提升,所以 g 是 undefined 。
  2. 没关系
  3. 有关系
许你一世情深 2022-09-18 20:45:28

看眼这个吧。
不同浏览器貌似还不一样 ...

以下拷贝自上面的网站:

var hoisted = "foo" in this;
console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
if (false) {
  function foo(){ return 1; }
}

// In Chrome: 
// 'foo' name is hoisted. typeof foo is undefined
// 
// In Firefox:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Edge:
// 'foo' name is not hoisted. typeof foo is undefined
// 
// In Safari:
// 'foo' name is hoisted. typeof foo is function
盛夏已如深秋| 2022-09-18 20:45:28

clipboard.png

不管条件是否成立都要进行变量提升,但是新版本浏览器只对函数进行声明

你把这段代码贴到IE8中执行再看看

比忠 2022-09-18 20:45:28

看起来就很复杂的样子

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文