跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 询问一个 JS 函数题
未分類
12 2 月 2021

询问一个 JS 函数题

询问一个 JS 函数题

資深大佬 : MLLB 1

var a = 10; {     a = 99;      function a() {         console.log(a);     }     a = 30; } console.log(a); 

如上,请问为什么最终的打印结果是 99 呢?

大佬有話說 (36)

  • 資深大佬 : xy90321

    变量作用域往上找,找到啥就是啥。
    另外你什么浏览器跑的是 99 ?

  • 資深大佬 : dousha99

    @xy90321 在 NodeJS 15.8.0 的 REPL 里测试,确实输出 99. Firefox 85 下测试结果为 10.

    我原以为 JS 里没有这种未定义行为 /依赖于解释器实现的行为,今天是长见识了。

  • 資深大佬 : wunonglin

    写得太骚了。

    这题的关键是作用域吧?把 var 换成 let 就能得到 10 了,还有那两括号是什么意思还没找到,但是去掉括号一行行执行结果是 30 的,具体为什么我也不清楚,第一次见这样写,我悟了

  • 資深大佬 : lichdkimba

    firefox 10 chrome 99

    我服了 别出这种题目了行不行。。。。。。

  • 資深大佬 : Building

    请问有什么需求要求一定要这样写吗?写个代码都搞得跟八股文似的。

  • 資深大佬 : Caballarii

    js 是世界上最好的语言

  • 資深大佬 : POPOEVER

    {} 的写法相当于 var

  • 資深大佬 : kaiki

    自从我知道不同浏览器的 JS 代码有不同的支持的时候,就不会去写这种花里胡哨的代码了。
    能跑出一样的结果就行,反正是在客户的机子上跑,又不占我服务器,效率低点就低点。

  • 資深大佬 : mrochcnnnnn

    @Caballarii

  • 資深大佬 : iugo

    “`js
    var a = 10;

    for (let i = 0; i < 1; i++) {
    a = 99;

    function a() {
    console.log(a);
    }

    a = 30;
    }

    console.log(a);
    “`

    这样看我们就容易接受一点.

    我预期应该是返回 10 的, 之所以返回 99 可能和 V8 在作用域内没有函数声明进行提升有关.

    刚好, 我们要强调, 在写 JS 的时候有如下要注意:

    1. 在函数声明时, 避免重名.
    2. 函数声明时, 尽量在顶级, 否则使用箭头函数.

    在 ESLint 下或者 TypeScript 下, 基本是写不出这么 “错误的” 代码的. 肯定会在写的时候报错.

  • 資深大佬 : across

    看结果明白为什么(同名函数区域覆盖)。
    不过具体规则懒得找了,现在都用 let 而且搞同名写法也会被骂的…

  • 資深大佬 : oott123

    https://github.com/tc39/ecma262/issues/2308

  • 資深大佬 : finalwave

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions#%E5%9D%97%E7%BA%A7%E5%87%BD%E6%95%B0

    非严格模式下的块级函数问题。

    if 和 for 里面的实现取决于浏览器,参考
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function#%E6%9C%89%E6%9D%A1%E4%BB%B6%E7%9A%84%E5%88%9B%E5%BB%BA%E5%87%BD%E6%95%B0

    总的来说就像 10 说的,别这么用,要用就上匿名函数。

  • 資深大佬 : Sample

    新时代八股
    大清早就亡了
    es2020 都来了
    let 也可以考察作用域
    该公司的代码难道也这样写吗?
    茴香豆的茴字就贵公司知道有四种写法?

    非要拿着旧时代的裹脚布狂舔,真的不恶心吗

  • 資深大佬 : f0rger

    第一眼也是应该不是 99
    我逆向推,得到 across 的答案。
    不过这写法真的是吐了……

  • 資深大佬 : crab

    @lichdkimba C 中的 多次++ —

  • 資深大佬 : DOLLOR

    尽量用函数表达式 const func = ()=>{…},而不是函数声明 function func(){…}

  • 資深大佬 : rodrick

    别搞这种题了。。真的累

  • 主 資深大佬 : MLLB

    @lichdkimba 我也实属无奈。要做。

  • 主 資深大佬 : MLLB

    @Building 可以理解为学校的题目。

  • 資深大佬 : across

    这种题目拿来做分析理解其实没什么问题,可以认识到 js 的缺陷表现。
    你不知道的 js 第一本有专区讲过这些问题

  • 資深大佬 : zhoudaiyu

    int a = 5; a= ++++++a++++++++; cout << a;

  • 資深大佬 : cyberpoint

    现在出这种题目的都是 NT

  • 資深大佬 : ttoott200

    好神奇! a = 99 改变了全局变量 a,函数声明 function a() 相当于以 let 方式创建了一个局部变量 a,后面的 a = 30 改变了局部变量,不会影响到全局变量,最后输出的 a 是 99 。

  • 資深大佬 : Kininaru

    如果我同事写这种代码给我看,我会考虑偷偷拔掉他的头发

  • 資深大佬 : AndyAO

    学校里居然开始教 JavaScript 了 !

    请问主你是什么学校?什么专业?

  • 資深大佬 : autoxbc

    @Caballarii #6 JavaScript 天天抄别人的语言特性,早晚会抄成最好的语言

  • 資深大佬 : deepall

    safari 30
    chrome 99
    哈哈哈

  • 資深大佬 : justin2018

    我这有的学校外聘老师讲课 讲一次课 1k 左右

    一个月 几节课~

  • 資深大佬 : wish8023

    ## 额,自己看调用栈吧!
    ![]( https://images.gitee.com/uploads/images/2021/0214/203741_ddbd9ad6_2056918.png)

  • 資深大佬 : wish8023

    @wish8023
    额,自己看调用栈吧!
    https://sm.ms/image/JZmKwI8Pgu3pWBD

  • 資深大佬 : wish8023

    调用栈: 询问一个 JS 函数题

  • 資深大佬 : jinliming2

    IE 下、旧 IE 下打印的是 function a() { console.log(a); }:
    https://i.loli.net/2021/02/15/S97y1WPJxCRlAj2.png

  • 資深大佬 : jinliming2

    但是添加 “use strict” 之后就打印 10 了:
    ![image.png]( https://i.loli.net/2021/02/15/erJPX7dDu35RVq1.png)

  • 資深大佬 : mxT52CRuqR6o5

    现在上学没办法,毕业之后不要太研究这种东西,不然就成孔乙己了

  • 資深大佬 : lixingjun

    实战中这种问题几乎碰不到,还是多实现一些确定的功能,代码水平才能真正进步

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具