一、this关键字是什么?
this代表的是 执行这个this代码的环境对象
二、函数的写法分类
1.声明式函数
声明函数:直接在作用域写一个函数
function fn(){
}
2.定义式函数
定义一个函数:直接创建一个函数 把它当做数据一样
var obj={
say:function(){}
}
var a=function(){}
var arr=[function fn(){},200,300]
arr[0]();
(function(){})()
2.自调用式函数
函数可以不写函数名
var a=function(){}
a()
var arr=[function(){}]
arr[0]
function fn(){
}
(200)+90;
([100,230,40]).push(100);
// 匿名函数
(function(){
console.log(123)
console.log(this)
})();
- fn()() window 小括号 它是一种运算符 指向结果
function fn(){
return function fm(){
console.log(this)
}
}
var obj={}
obj.fm=fn()
obj.fm()
fn()() //window
三、this的分类
- this在脚本中代表的是window全局对象
console.log(this) //window
- this在全局函数中代表的是window全局对象
function fn6666(){
console.log(this,1111111111) //window
}
window.fn6666() //window
- var a=20 全局变量会在脚本执行时,把变量名设置为全局对象window的属性
function fn(){console.log(this)}全局函数会在脚本执行时,把函数设置为全局对象window的方法 - this代表的是 执行这个this代码的 环境对象
var a=this;
console.log(a);
function fn () {
console.log(this)
}
fn()// window.fn() 对象调方法
var obj={
name:"karen",
fn:function(){
console.log(this) //obj
}
}
obj.fn()
var obj2={fn:function(){
console.log(this,1111) //arr obj2
}}
var arr=[]
arr[0]=100
arr[1]=obj2.fn
console.log(arr[1])//打印fn函数
arr[1]()
obj2["fn"]()
- this关键字代表了函数调用时的调用者
function fn () {
console.log(this)
}
fn()//这个代码不是fn在调用 fn代表的是一个函数 隐式的window才是调用者
obj.say()//obj
arr[1]()//arr
sindata.statuses[1].user.say()//sindata.statuses[1].user
var obj={
name:"芭比",
son:{
name:"儿子",
say:function(){
console.log(this) //obj.son
}
}
}
obj.son.say()
var a=obj.son.say
a() //window
var arr=[a]
arr[0]() //arr
四、this面试题
题1:
var obj={
name:"karen",
say:function(){
console.log(this)
function fn(a){
console.log(a,this)
}
fn(this)
}
}
obj.say()
答案:
分析:在js程序中无论多么复杂的程序 this只需要看离最近(嵌套)的function的这个单词的调用者
题2:
var name = 'lili';
var obj = {
name: 'liming',
prop: {
name: 'ivan',
getname: function() {
return this.name;
}
}
};
console.log(obj.prop.getname());//ivan
var test = obj.prop.getname;
console.log(test());
答案:
分析:obj.prop.getname(),返回值是this.name,this是obj.prop,也就是obj.prop.name,对应的是ivan;将obj.prop.getname对应的属性值赋值(是个函数)给test,调用test函数返回this.name,此时的this是window,所以test函数调用后的返回值是window.name,也就是lili
题3;
function Foo() {
getName = function () {console.log (1);};
return this;
}
var getName = function () {console.log (4);};
Foo().getName ();
答案:1
解析:
/*
function Foo() {
getName = function () {console.log (1);};
return this;
}
var getName = function () {console.log (1);}; //function () {console.log (4);};
Foo()===>window
Foo().getName ()==>window.getName ()==>getName ()
*/
题4:
function a(xx) {
this.x = xx;
return this;
};
var x = a(5);
var y = a(6);
console.log(x.x);
console.log(y.x);
答案:
解析:
题5:
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log (a.x);
console.log (b.x)
答案:
解析:a是最后赋值(引用)的 但是a的引用声明是一开始就有了
五、为何要打印this?
this代表了一个对象,常常在项目中我们要给一个对象操作成员
// this代表了一个对象 常常在项目中我们要给一个对象操作成员
{
name:"karen",
chaneg:function(a){
obj.name=a
}
}
this.xxx=100
总结
this总结:
fn()// window
obj.fn() //obj
obj.xx.xx2()//obj.xx
(function(){})() window
fn()() window
fn()1 fn()返回的数组