33,下面的代码打印什么内容

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

IIFE: 立即执行函数表达式的由来。
1,相对其他面向对象语言,JS的作用域控制手段很匮乏,只有全局作用域很函数作用域。块级作用域是ES6以后才出现的
2,既然只有函数作用域scope,那么需要隔离一些变量的时候,就用function来隔离吧
3,虽然封装一个函数绝大多数是为了,复用。但是js中却多了一个目的,为了隔离。
4,既然只运行一次,就立即执行吧。
5,既然立即执行,后面也不会再调了,那函数名也不要了吧。
6,普通的函数是声明式函数Function,而IIFE是()开头。JS不会认为他是声明Function

上面:
作用域:执行上下文中包含作用域链:
在理解作用域链之前,先介绍一下作用域,作用域可以理解为执行上下文中申明的变量和作用的范围;包括块级作用域/函数作用域;
特性:声明提前:一个声明在函数体内都是可见的,函数声明优先于变量声明;
在非匿名自执行函数中,函数变量为只读状态无法修改;

所以下面这个,只读函数变量,是没问题的。
var b = 10;
(function b(){
    'use strict'
    console.log(b); 
})();
但是下面这个,想更改自执行函数变量b,会报错
var b = 10;
(function b(){
    'use strict'
     b = 20;
    console.log(b); 
})();
'use strict'必须放在第一行,不然整个区块无效,不会使用严格模式。ES5

你可能感兴趣的:(33,下面的代码打印什么内容)