In most cases, the value of this
is determined by how a function is called (runtime binding).
Let's have a look some examples
Q1
function a(){
function b(){
console.log(this) // window
function c(){
"use strict";
console.log(this) // undefined
}
c()
}
b()
}
a()
In a function with strict mode, this
is undefined
.
Q2
var name = 'A'
function special(){
console.log(this.name)
}
var girl = {
name:'B',
detail: function(){
console.log(this.name)
},
woman: {
name: 'C',
detail: function(){
console.log(this.name)
}
},
special: special
}
girl.detail() // b
girl.woman.detail() // c
girl.special() // b
girl.detail()
, in detail function, this point to girl object
girl.woman.detail()
, in detail function, this point to woman object
girl.special()
, in special function, this point to girl.
Q3
var name = 'red'
function a(){
var name = 'white'
console.log(this.name)
}
function d(i){
return i()
}
var b = {
name:'yellow',
detail: function(){
console.log(this.name)
},
bibi: function(){
console.log(this.name + 'bibi is called.')
return function(){
console.log(this.name)
}
}
}
b.detail() // yellow, b call detail function, so
var c = b.detail
c() // red
b.a = a
a() // red
b.a() // yellow
var e = b.bibi() // yellow bibi is called.
d(b.detail) // red
e() // red
b.detail()
, b call detail function, so in detail function scope, this points to object b.
var c = b.detail
, assign detail function to variable c
c()
, in this function, this point to window
var e = b.bibi()
, b.bibi() means execute bibi function, and return a new function to var e.
Q4
const obj = {
name: 'xiu',
sing() {
return 'lalalal ' + this.name
},
singAgain(){
return this.sing() + this.name
}
}
obj.sing() // lalalal xiu
Q5
function importantPerson(){console.log(this.name)}
const name = 'sunny'
const obj1 = {
name:'xiu',
importantPerson:importantPerson
}
const obj2 = {
name:'gou',
importantPerson:importantPerson
}
importantPerson() //sunny
obj1.importantPerson() // xiu
obj2.importantPerson() // gou
Q6
const a = function(){
console.log(this) // window
const b = function(){
console.log(this) // window
const c = {
hi: function(){
console.log(this)
}
}
c.hi() // object c, as c call hi function
}
b()
}
a()
Q7
const obj = {
name: 'xiu',
sing() {
console.log('a', this) // obj
var anotherFunc = function(){
console.log('b', this) // window
}
anotherFunc()
}
}
obj.sing()
Q8
const obj = {
name: 'xiu',
sing() {
console.log('a', this) // obj
var anotherFunc = () => {
console.log('b', this) // obj
}
anotherFunc()
}
}
obj.sing()
in arrow function, they don't have this
keyword, they inherit it from their parent.
Q9
const obj = {
name: 'xiu',
hobbies: ['coding','sleeping'],
show() {
this.hobbies.map((hobby) => {
console.log(`${this.name} loves ${hobby}`)})
},
showAgain() {
this.hobbies.map(function(hobby){
console.log(`${this.name} loves ${hobby}`)
})}
}
obj.show()
obj.showAgain()
obj.show()
, as it's arrow function in show(), so this point to obj
obj.showAgain()
, this point to window,
Q10
let f = function(){
console.log('1',this) \\ window
const say = () => {
console.log('2',this)
}
say() \\ window
}
f()
Q11
const a = {
say(){
console.log('a',this)
const b = function(){
console.log('b', this)
const f = () => {
console.log('f',this)
}
f()
}
b()
const d = () => {
console.log('d', this)
}
d()
},
}
a.say()
// a: a
// b: window
// f: window
// d: a
Top comments (0)