GitHub (opens new window)

你不知道的 JS(上)

coderljw 2024-10-13 大约 5 分钟

# 1. 编译原理

# 2. LHS 与 RHS

# 3. 编译器有话说小测验

function foo(a) {
  var b = a
  return a + b
}

var c = foo(2)
1
2
3
4
5
6
  • LHS 查询(3 处):c = ..、a = 2(隐式变量分配)、b = ..
  • RHS 查询(4 处):foo(2..、= a、a ..、.. b

# 4. 作用域是什么

# 5. 词法作用域与动态作用域

function foo() {
  console.log(a) // 词法作用域打印2,动态作用域打印3
}

function bar() {
  var a = 3
  foo()
}

var a = 2
bar()
1
2
3
4
5
6
7
8
9
10
11

# 6. 欺骗词法

# 7. 立即执行函数表达式-IIFE

;(function foo() {
  console.log(777)
})()

;(function foo() {
  console.log(777)
}())

!function foo() {
  console.log(777)
}()
1
2
3
4
5
6
7
8
9
10
11

# 8. try / catch

try {
  undefined()
} catch (err) {
  console.log(err)
}

console.log(err) // ReferenceError: err is not defined
1
2
3
4
5
6
7

# 9. 闭包

function foo() {
  var a = 1
  // var b = 1
  return function bar() {
    // debugger // b 被销毁
    a++
    console.log(a)
  }
}

var bar = foo()
bar()
1
2
3
4
5
6
7
8
9
10
11
12
function wait(message) {
  setTimeout(function timer() {
    console.log(message)
  }, 1000)
}

wait('Hello,closure!')
1
2
3
4
5
6
7

# 10. 显示绑定

function foo() {
  console.log(this.TheOne)
}
Number.prototype.TheOne = 'NEO'
String.prototype.TheOne = 'NEO'
Boolean.prototype.TheOne = 'NEO'
foo.call(7)
foo.apply('Matrix')
foo.bind(true)

7..TheOne // NEO
'Matrix'.TheOne // NEO
true.TheOne // NEO
1
2
3
4
5
6
7
8
9
10
11
12
13

# 11. this 绑定规则

function foo() {
  console.log(this.a) // 2
}

var a = 2
foo()
1
2
3
4
5
6
function foo() {
  console.log(this.a) // 2
}

var obj = {
  a: 2,
  foo: foo,
}

obj.foo()
1
2
3
4
5
6
7
8
9
10
function foo() {
  console.log(this.a) // 2
}

var obj = {
  a: 2,
}

foo.call(obj)
1
2
3
4
5
6
7
8
9
function Foo(a) {
  this.a = a
}

var bar = new Foo(2)
console.log(bar.a) // 2
1
2
3
4
5
6

# 12. this 全面解析

function foo() {
  console.log(this.a) // 2
}

var a = 2
foo.call(null)
1
2
3
4
5
6

# 13. 原型

以父之名
周杰伦.mp3