首页 > 试题广场 >

请问以下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 回复(9)
这里又算是一种特殊情况~~
立即执行函数如果有函数名,那么函数体内不可以修改函数名!也不会报错,就是无效!
(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 回复(6)
上面是一个立即执行的函数表达式(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)
IIFE(立即调用函数表达式)函数名不允许更改,非严格模式下静默失败,严格模式下报错:"Uncaught TypeError: Assignment to constant variable." 所以函数内部的 a=20 无效,输出的a还是函数a
发表于 2022-04-19 22:52:24 回复(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)
<1>函数内部可以访问到自己本身(如果函数再内部调用本身,递归)
<2>没有使用var声明的变量会被挂在window对象上;所以函数内的a并不再函数作用域内,而是全局作用域,window.a=20
<3>立即执行函数是一个函数表达式,执行到那一行才会产生函数声明,所以函数内部的a,就是它自己本身
发表于 2022-05-04 15:26:07 回复(0)