// 定义:
// 声明
// 执行:
// 函数名+()
// 函数的定义的位置
// 函数的执行的位置
// 位置
// this:执行上下文,this一般存在于函数中,表示当前函数的执行上下文,如果函数没有执行,那么this没有内容,只有函数在执行后this才有绑定
// 执行的位置!!!
// 1.默认执行:fn():this指向window,严格模式指向undefined
// function fn(){
// "use strict"
// console.log(this)
// }
// fn()
// 2.通过对象执行(通过上下文对象执行,隐式执行):obj.fn():当前的执行对象
// function fn(){
// console.log(this)
// }
// var a = 10;
// var obj = {
// a:20,
// b:fn
// }
// obj.b();
// var obj2 = {
// a:30,
// b:obj.b
// }
// obj2.b();
// var obj3 = {
// a:40,
// b:obj2
// }
// obj3.b.b()
// 隐式丢失
// setTimeout(obj.b, 2000);
// function setTimeout(cb,t){
// // t
// cb()
// }
// 3.显式执行(通过函数的方法bind执行):指定的是谁,就是谁
function fn(){
console.log(this)
}
var f = fn.bind(window);
f();
// 找回隐式丢失的this,其实就是使用显式执行,强行绑定
// setTimeout(obj.b.bind(obj), 3000);
// 谁执行了this所在的函数,this就是谁
// 场景:
// 1.默认执行:非严格模式下指向window
// window || undefined
// 2.隐式执行:通过任意对象执行
// 直接的执行对象
// 3.显式执行:通过函数的bind或call或apply执行
// 写谁就谁
// function fn(){
// console.log(this)
// }
// var obj = {}
// obj.fn = fn;
// obj.fn(); //obj
// var obtn = document.getElementById("btn");
// obtn.onclick = fn;
// // 点击时 //obtn
// fn.bind("hello")(); //"hello"
// var f = fn.bind(obj);
// f(); //obj
// fn(); //window
// 4.构造函数执行(通过new执行)
function fn(a){
console.log(this)
console.log(a)
console.log(arguments)
}
fn("admin")
var f = fn.bind("hello","zhangsan");
f("root")
// bind():执行结束后,会返回一个新函数,新函数是被改变了this和参数的老函数
// 一种:一个参数:
// 参数:表示this的指向
// 二种:多个参数:
// 参数1:表示this的指向
// 参数2:会与原函数的参数一起放在新函数中
// ...
// bind将新的参数和老的参数,一起传给了新的函数
// 改变this指向
var obj = {
name:"obj",
show:function(){
console.log(this.name)
}
}
obj.show()
var obj2 = {
name:"obj2"
}
obj.show.bind(obj2)
var name = "zhangsan";
obj.show.bind(window)();
// window.name = "张三"
// this只能是对象