// ES6块级作用域
if (true) {
let x = 100
}
console.log(x) // 会报错,因为访问不到x
函数作为返回值被返回:
// 函数作为返回值
function create() {
let a = 100
return function () {
// function()在这里被定义,此时a为100
// 打印的a的值为被定义时的值
console.log(a)
}
}
let fn = create()
let a = 200
fn() // 100
函数作为参数被传递:
// 函数作为参数被传递
function print(fn) {
let a=200
fn()
}
let a=100
function fn() {
// 函数fn被定义时a的值是100
// 所以打印的a的值为100
console.log(a);
}
print(fn) // 100
function fn1(){
console.log(this)
}
fn1() // window
fn1.call({ x : 100}) // {x : 100}
const fn2=fn1.bind({x : 200})
fn2() // {x : 200}
bind返回新的函数去执行,bind直接调用执行。
const zhangsan={
name:'张三',
sayHi(){
// this 即当前对象
console.log(this)
},
wait(){
setTimeout(function(){
// this===window
console.log(this);
})
}
}
class中,this指向当前对象。
const zhangsan = {
name: '张三',
sayHi() {
// this 即当前对象
console.log(this)
},
waitAgain() {
setTimeout(() => {
// this 即当前对象
console.log(this);
})
}
}
箭头函数中的this取它上级作用域的值。
class People {
constructor(name) {
this.name = name
this.age = 20
}
sayHi() {
console.log(this);
}
}
const zhangsan = new People('张三');
zhangsan.sayHi() // zhangsan对象
class中的this指向这个类的实例对象。
// 创建10个`<a>`标签,点击的时候弹出来对应的序号
let i, a
for (i = 0; i < 10; i++) {
a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click', function (e) {
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
}
点击任意<a>
标签,alert
出来的都是10
,原因是因为i
是全局变量。
修改代码:
// 创建10个`<a>`标签,点击的时候弹出来对应的序号
let a
for (let i = 0; i < 10; i++) {
// 每一个i都有一个块级作用域
a = document.createElement('a')
a.innerHTML = i + '<br>'
a.addEventListener('click', function (e) {
e.preventDefault()
alert(i)
})
document.body.appendChild(a)
}
bind
函数具有:
this
// 模拟bind
Function.prototype.bind1 = function () {
// 将参数拆解为数组
const args = Array.prototype.slice.call(arguments)
// 获取this(数组第一项)
const t = args.shift()
// fn1.bind(...)中的fn1,
// this指向bind函数的调用者,赋值为self变量
const self = this
// 返回一个函数
return function () {
return self.apply(t, args)
}
}
function fn1(a, b, c) {
console.log('this', this)
console.log(a, b, c)
return 'this is fn1'
}
const fn2 = fn1.bind({ x: 100 }, 10, 20, 30)
const res = fn2()
console.log(res)
打印结果:
this