💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
~~~ var b = 10; (function b(){ b = 20; console.log(b); })(); ~~~ ~~~js var b = 10; (function b() { // 内部作用域,会先去查找是有已有变量b的声明, //有就直接赋值20,确实有了呀。发现了具名函数 function b(){},拿此b做赋值; // IIFE的函数无法进行赋值(内部机制,类似const定义的常量),所以无效。 // (这里说的“内部机制”,想搞清楚,需要去查阅一些资料, //弄明白IIFE在JS引擎的工作方式,堆栈存储IIFE的方式等) b = 20; console.log(b); // [Function b] console.log(window.b); // 10,不是20 })(); ~~~ 所以严格模式下能看到错误:`Uncaught TypeError: Assignment to constant variable` ~~~js var b = 10; (function b() { 'use strict' b = 20; console.log(b) })() // "Uncaught TypeError: Assignment to constant variable." ~~~ 其他情况例子: 有`window`: ~~~js var b = 10; (function b() { window.b = 20; console.log(b); // [Function b] console.log(window.b); // 20是必然的 })(); ~~~ 有`var`: ~~~js var b = 10; (function b() { var b = 20; // IIFE内部变量 console.log(b); // 20 console.log(window.b); // 10 })(); ~~~ ## 解答 1)打印10 ~~~ var b = 10; (function b(b) { window.b = 20; console.log(b) })(b) //或者 var b = 10; (function b(b) { b.b = 20; console.log(b) })(b) ~~~ 2)打印20 ``` var b = 10; (function b(b) { b = 20; console.log(b) })(b) // 或 var b = 10; (function b() { var b = 20; console.log(b) })() ``` ## 解释 > 打印10的第一种方法:b已经作为参数被传进函数里去了, > 即使函数内使用`window.b = 20;`改变了全局的b也已经对它没有影响了, 所以会打印出原先的10。    ``` var b = 10; (function b(b) { console.log(b) //10 })(b) ``` > 打印20的第一种方法:函数里的b并不是全局的b,修改它也不会影响到全局的b。   > 基本数据类型的传递只是传递数值,比如此处不管你修改的是函数外的b还是函数内的b都不会对对方造成影响。对象的传递才是按引用传递,一个变了全部都要变,可以了解一下js里关于基本数据类型和引用数据类型内存空间的存储方式。 ## 摘自 [ 简单改造下面的代码,使之分别打印 10 和 20](https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/51) [ 第 33 题:下面的代码打印什么内容,为什么?](https://www.muyiy.cn/question/js/33.html) [ 在JavaScript的立即执行的具名函数A内修改A的值时到底发生了什么?](https://segmentfault.com/q/1010000002810093)