var b = 10; (function b() {b = 20; console.log(b); })();会打印什么你了解吗?

要知道打印什么需要具备2个知识点
  一、函数声明和函数表达式的区别
  二、匿名函数与具名函数的区别

首先来说说第一点:

要区分函数声明和函数表达式,只需要知道function是不是声明中的第一个词,如果是,那就是函数声明,否则就是函数表达式;

函数声明和函数表达式之间最重要的区别是他们的名称标识符将会绑定在何处;
举个例子
  函数声明:
  function foo(){},foo 被绑定在所在作用域中,可以直接通过foo() 来调用它;
  函数表达式:
  (function foo(){})
  foo被绑定在函数表达式自身的函数中,外部作用域无法访问foo;

第二个知识点匿名函数与具名函数的区别
函数表达式可以是匿名,写成这样(function(){})是合法的;函数声明则不可以省略函数名;
具名函数有几个好处:
  a、在栈追踪中可以显示出有意义的函数名,调试方便;
  b、可以在函数内引用自身
  c、代码更具有可读性、可理解性;

具备以上两个知识点,就可以很好的分析会打印出什么了
  var b = 10;
  (function b() {
       // 会在这作用域内声明常量b,引用函数自身
    b = 20;
    console.log(b);
  })();

在立即执行函数表达式自调用后,会在自己的函数执行上下文中收集到一个和函数同名的b常量(表达式函数的标识符不可修改),常量的值为引用函数体自身;
接下来b = 20 是指向function b,由于自身特性不能改变b的引用,所以无效;
最后输出b函数;

 

 

 
posted @ 2023-04-01 14:10  heyujun-  阅读(226)  评论(0编辑  收藏  举报