首页 > 试题广场 >

请问以下JS代码会输出什么 var a = 10; (fun

[单选题]

请问以下JS代码会输出什么

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

  • 10
  • 20
  • undefined
  • 输出函数a的内容

第一眼以为是提升(hoist)的问题,差点搞错。变量名和函数名相同差点踩坑里去

函数可以在函数体中访问自己的标识符(函数名)

  • 这里面的 a = 20,a 实质上是函数名,log打印的是函数名为a的整个函数体
  • a=20是修改函数为20,不会在function里面产生额外的变量,但是不能修改,所以此这条语句是无效的,别***扰了,忽略掉即可,或者你换成b=20就好理解了,这样就会产生全局变量b了。
    var a = 10;  //函数已经在体内找到名为a的了
    //因此不会到全局作用域去找全局变量a(var a = 10)
    (function a() {
      a = 20; //这里的a是函数名,相当于修改函数a=20,无效
      console.log(a); //a是函数名,打印整个a函数体
    })()
    

```

发表于 2021-12-10 14:43:46 回复(10)
这里又算是一种特殊情况~~
立即执行函数如果有函数名,那么函数体内不可以修改函数名!也不会报错,就是无效!
(function add(){
    add = 100;//此行代码作废,无效,因为此行代码的意思是要修改函数名,此处是立即执行函数,不允许被修改!
    console.log(add);
})();

(function (){
    a = 100;// 此时的a成为全局变量,挂在到window上!
    console.log(a);
})();
console.log(a);//100
var add = 1;
function add(){
    add = 2;
    console.log(add);//2
}
add();//
如果函数带参数,又出现与变量同名的情况,又又是另外的情景了...
var a = 1;
function add(a=2){  
   console.log(a);//2  这地方的a在预解析变量声明提升处理完成后,最后一步会把同名的参数a的值2,赋值给变量a
   var a = 3;
   console.log(a);//3

}
add();
console.log(a)//1 
var a = 1;
function add(a){  
   console.log(a);//88  这地方的a在预解析变量声明提升处理完成后,最后一步会把同名的参数a的值88,赋值给变量a
   var a = 3;
   console.log(a);//3

}
add(88);
console.log(a)//1 
。。。综合 。。。 (函数内 会形成参数作用域(父)和函数体内的作用域(子级)两级作用域
var a = 1;
function add(a=1,b=function(){
  a = 3;
  console.log(a);//3  修改的是参数体内的a!
}){  
    b();
   console.log(a);//1 变量声明提升之后,被同名函数a覆盖,后又被同名参数a覆盖,最终值为1
   var a = 10; // 赋值留在了原地,
   console.log(a);//10。    function a(){
       } }
add();
console.log(a)//1  最外层的a变量

最近这些概念搞来搞去,有点吃不消了,为什么这么杂呢,没有统一的来处理这些。
现在这道题目又来告诉我立即执行函数名,在函数内部不可以被修改!

路过的大佬,解决这类问题,有没有什么好办法?


编辑于 2022-05-10 16:13:40 回复(7)
上面是一个立即执行的函数表达式(IIFE),而且是一个具名的函数表达式(NFE)。在ECMAScript 标准中要求 NFE 实现两个特性1.只能在函数体内访问函数名变量。2.函数名变量可以理解为常量,不可改变。所以a = 20被忽略了,在严格模式下会报错
发表于 2022-03-10 16:55:41 回复(1)
没有定义形参接收实参,每次遇到这类题我就头疼
发表于 2022-03-09 13:35:08 回复(1)
我还是不理解呜呜呜
发表于 2022-08-30 19:54:56 回复(0)
在立即函数内的作用域,里面 a=20 就是给函数重新赋值,并不是重新建立一个变量 a,给函数重新赋值无效
发表于 2023-02-20 12:32:58 回复(0)
那个立即执行函数是函数声明表达式,函数声明表达式是不会被提升的
发表于 2022-08-17 10:58:26 回复(0)
<1>函数内部可以访问到自己本身(如果函数再内部调用本身,递归)
<2>没有使用var声明的变量会被挂在window对象上;所以函数内的a并不再函数作用域内,而是全局作用域,window.a=20
<3>立即执行函数是一个函数表达式,执行到那一行才会产生函数声明,所以函数内部的a,就是它自己本身
发表于 2022-05-04 15:26:07 回复(0)
IIFE(立即调用函数表达式)函数名不允许更改,非严格模式下静默失败,严格模式下报错:"Uncaught TypeError: Assignment to constant variable." 所以函数内部的 a=20 无效,输出的a还是函数a
发表于 2022-04-19 22:52:24 回复(0)
这道题之所以会打印出“函数 a 的内容”(也就是题目给出的选项 D),关键原因在于 **IIFE 里那个 `function a(){}` 的“命名函数表达式”** 和外部的 `var a = 10` 并不是同一个变量,也不会去修改到外部的 `a`,反而在函数内部“a”会指向函数自身。 简单来说,代码 ```js var a = 10; (function a() { a = 20; console.log(a); })(); ``` 在 JavaScript 里有这么几件事需要注意: 1. **(function a() {…}) 里的 a 属于函数名** 当我们写 `function a() {}` 这种带有函数名的函数表达式时,函数体内部的标识符 `a` 指向的其实是这个函数对象本身;它并不会跑到外面的全局(或父级)作用域去找那个 `var a = 10`。所以这里的“`a`”是**函数本身**,而不是外部的 10。 2. **给函数名重新赋值通常是无效的或者会报错** 在非严格模式下,像 `a = 20;` 这种赋值要么被引擎忽略,要么就直接把函数名当成只读变量处理。反正它不会真的把那个函数名变量改成数值 20。 - 如果在严格模式下,甚至会直接报错(TypeError:无法给只读变量赋值)。 - 非严格模式下多数情况下被引擎“静默忽略”(并不一定所有浏览器都一致,但普遍是忽略),所以你依然拿到的是那个函数对象本身。 3. **console.log(a) 最终打印出函数对象** 正因为在这段代码里,内部的 `a` 一直是这个函数对象本身,所以 `console.log(a)` 最终打印出来的就是整个函数的定义(某些环境里会显示成 `ƒ a(){…}` 之类的东西)。 因此,这个 IIFE 内部的 `function a(){}` 跟外部的 `var a = 10` 并没有“同名可互相操作”的关系。它实际上屏蔽了外层的 `a`,导致 `console.log(a)` 输出的并不是 10,也不是 20,而是**函数本身**。这就是题目给出的“正确答案是 D(输出函数 a 的内容)”的原因。
发表于 2025-01-16 11:18:03 回复(0)
普通函数: function a(){ a = 34; console.log(a) // 打印结果是34 } a() 立即执行函数: (function a(){ a = 34; console.log(a) //打印结果是函数a })()

发表于 2024-02-27 17:42:05 回复(0)
函数赋值
发表于 2022-12-16 10:29:24 回复(0)