this指向
- 在严格模式下
"use strict"
function foo(){
console.log(this)//undefined
}
foo()
严格模式下,this指向undefined
- 普通函数中
普通函数下,谁调用这个函数,this就指向谁
function foo(){
console.log(this)//window
}
foo()//全局函数可以看成是window对象的方法,相当于window.foo()
var obj={
name:"hello",
sayHello:function(){
console.log(this) //指向object对象 {name: "hello", sayHello: ƒ}
}
}
obj.sayHello()
var obj={
name:"obj",
sayHello:function(){
console.log(this.name)//obj
}
}
obj.sayHello()
console.log(obj.name)//obj
var obj={
name:"obj",
sayHello:function(){
return function(){
console.log(this.name)//不输出结果,因为只是返回了一个函数体,但是并没有调用该函数
}
}
}
obj.sayHello()
console.log(obj.sayHello()) //f(){}
console.log(obj.name)//obj
要输出可以有两种形式
1.var f=obj.sayHello()
f()
2.obj.sayHello()()
var name="window"
var obj={
name:"obj",
sayHello:function(){
console.log(this)//obj对象
return function(a){
console.log(this.name)//不输出结果,因为只是返回了一个函数体,但是并没有调用该函数
console.log(a)//10
}
}
}
// obj.sayHello()
console.log(obj.sayHello()) //f(){}
console.log(obj.name)//obj
/// var f=obj.sayHello()
// window.f() //window
// f(10)
// obj.sayHello()()//window
- 箭头函数中的this指向
指向定义这个箭头函数时所在的环境中的this
在哪个地方定义,指向哪个地方的this
var foo=()=>{
console.log(this) //window对象
}
foo()
var name = "window"
var obj = {
name: "obj",
sayHello:()=>{
console.log(this.name) //window
}
}
obj.sayHello()
var name = "window"
var obj = {
name: "obj",
sayHello:function(){
return ()=>{
console.log(this.name) //obj
}
}
}
obj.sayHello()()
var name = "window"
var obj = {
name: "obj",
sayHello:()=>{
return ()=>{
console.log(this.name) //window
}
}
}
obj.sayHello()()
var name = "window"
var obj = {
name: "obj",
sayHello:()=>{
return function(){
console.log(this.name) //window
}
}
}
obj.sayHello()()
var name = "window"
var obj = {
name: "obj",
sayHello:function(){
console.log(this)//obj对象
setTimeout(()=>{
console.log(this.name) //obj
})
}
}
obj.sayHello()
//call和apply传递参数形式不同,call以列表形式传递,apply以数组形式传递
var obj2={
name:"obj2",
}
//call和apply传递参数形式不同,call以列表形式传递,apply以数组形式传递
obj1.sayHello.call(obj2,10,20) //call方法改变了this指向 指向call方法的第一个参数
obj1.sayHello.apply(obj2,[30,60])//apply方法改变了this指向 指向apply方法的第一个参数
obj1.sayHello.bind(obj2)(10,80)//bind方法改变了this指向 指向bind方法的第一个参数
//取数组中的最大值和最小值及其索引
var arr=[10,-123,68,2,5]
var minVal=Math.min.apply(null,arr)
console.log(minVal)//-123
var indexOf=arr.indexOf(minVal)
console.log(indexOf)//1