执行步骤
- 形成一个私有作用域
- 形参赋值
- 变量提升,私有作用域中已经有的变量则不会进行提升
- 代码执行
- 栈内存释放问题
试题解析
console.log(a)
var a = 12
function fun() {
console.log(a)
var a = 13
}
fun()
console.log(a)
// undefined undefined 12
console.log(a)
var a = 12
function fun() {
console.log(a)
a = 13
}
fun()
console.log(a)
// undefined undefined 12
var foo = 1
function bar() {
if(!foo) { // 不管条件是否成立,都会在自己的作用域里面进行变量提升
var foo = 10
}
console.log(foo)
}
bar() // 10
var n = 0
function a() {
var n = 10
function b() {
n++
console.log(n)
}
b()
return b
}
var c = a()
c() // 里面的变量跟它在哪执行没关系,主要看它在哪儿定义的
console.log(n) // 11 12 0
var a = 4
function b(x, y, a) {
console.lot(a)
// 在 JS 非严格模式下,函数的形参和 arguments存在映射机制
// 即 x 赋值 100 ==> arguments[0] 就等于 100
arguments[2] = 10
console.log(a)
}
a = b(1, 2, 3) // a 为 b 的执行结果,b 没有 return 所以 a = undefined
console.log(a) // 3 10 undefined
function fun(x, y) {
var arg = arguments
arg[0] = 100
console.log(x)
y = 200
console.log(arg[1])
}
fun(10) // 100 undefined
// JS 非严格模式下形参和 arguments 有映射关系 ==> arg[0] 改变影响 x 的值
// 传入参数没有 y,所以 arguments 的 length 为 1,只有一个值无法与 y 进行映射,所以 arg[1] 为 undefined
var foo = 'hello'
(function(foo){
console.log(foo)
var foo = foo || 'world' // 变量提升,私有作用域中已经有的变量则不会进行提升
console.log(foo)
})(foo)
console.log(foo) // 'hello' 'hello' 'hello'
var a = 9
function fun() {
a = 0
return function(b) {
return b+a++
}
}
var f = fun()
console.log(f(5))
console.log(fun()(5))
console.log(f(5))
console.log(a) // 5 5 6 2 画图解决
var ary = [1, 2, 3, 4]
function fun(ary) {
ary[0] = 0
ary = [0]
ary[0] = 100
return ary
}
var res = fun(ary)
console.log(ary) // [0, 2, 3, 4]
console.log(res) // [100]
function fun(i) {
return function(n) {
console.log(n + i++)
}
}
var f = fun(10)
f(20) // 30
fun(20)(40) // 60 会开辟新的私有空间进行函数运算
fun(30)(50) // 80
f(30) // 41 在第一次执行的 fun 里面拿变量
var num = 10
var obj = {num: 20}
obj.fn = (function(num) {
this.num = num * 3
num++
return function(n) {
this.num += n
num++
console.log(num)
}
})(obj.num)
var fn = obj.fn
fn(5)
obj.fn(10)
console.log(num, obj.num) // 22 23 65 30
珠峰免费视频请戳这里。。。
网友评论