JS面向对象--4函数的上下文之五规律

函数的上下文就是指this是谁
规律1:函数用圆括号直接调用 ,函数的上下文是window对象

`function fun(){
  var a =100;
  alert(this.a);
}

var a =200;
fun();  //200

函数function fun(){}的上下文是什么 ,不要看它怎么定义 ,要看它怎么调用!此时是fun()函数名加上圆括号直接调用 ,此时上下文就是window对象

所有的全局变量都是window对象的属性,而函数里面的局部变量,不是window的属性,不是任何东西的属性,它就是一个变量

规律2 函数如果作为一个对象的方法,对象打点调用 ,函数的上下文就是这个对象 .

function fun(){
  var a =888;
  alert(this.a);
}
var obj ={
  "a" :10,
  "b" :20,
  "c" :fun    //给这个对象增加一个方法 值是fun函数
}

obj.c()   //10  不是圆括号直接执行,而是这个对象打点调用这个函数执行,所以函数的上下文是obj对象 。
function fun(){
  var a =888;
  alert(this.a);
}
var obj ={
  "a" :10,
  "b" :20,
  "c" :fun    //给这个对象增加一个方法 值是fun函数
}
var fff= obj.c;
fff();    //undefined

规律3 函数是事件处理函数,函数的上下文就是触发这个事件的对象

#box,#box1{
  width:100px;
  height:100px;
  background:red;
}
function fun(){ this.style.background ="orange"; } var box = document.getElementById("box"); var box = document.getElementById("box1"); //把同一个函数绑定给不同的对象 this点击谁就是谁 box.onclick =fun; box1.onclick =fun;

规律4 定时器调用函数,上下文是window对象

function fun(){
  alert(this.a);
}
var a =888;
setInterval(fun,1000);   //每秒弹出888

举例:点击一个小盒子,2秒变红

var box1 =document.getElementById("box1");

box1.onclick = function(){
  setTimeout(function(){
     this.style.background = "red";  //这里的this是window对象 window对象没有背景颜色属性,document.body有

  },2000)
}

报错
改写

box1.onclick = function(){
  var self = this;   //this备份
  //var that = this    //备份this  备份上下文方法
  //var _this = this
  setTimeout(function(){
    self.style.background = "red";  //

  },2000)
}

在定时器外面的事件处理函数中,this就是box1这个元素,此时 我们可以备份上下文,把this存为变量self,后面的程序 就用self指代box1

规律5:数组中存放的函数 被数组索引调用 this就是这个数组

function fun0(a,b,c,d,e){
  alert(this === arr);   //true
  alert(this.length); 
}
var arr = [fun0;"东风","晶晶"];
var length = 10;
arr[0]();  //3

一定要敏感:
arr[0]() ;
此时这个函数是从数组中枚举出来然后加圆括号执行的,所以最终调用者可以认为是这个数组,上下文就是这个数组

function fun0(a,b,c,d,e){
  alert(this.length); 
}

var length = 10;
fun0();  //10    这里圆括号直接调用  this 是window

你可能感兴趣的:(JS面向对象--4函数的上下文之五规律)