js---13 this call apply

//this:this可以写在js全剧环境中(全局环境中this是window对象),this可以写在函数中,可以写在对象中,
function f(){
     this.name = "asdfas";
}
var o ={
    name :"cj",
     print:function(){
        console.log(this.name);
    }
};
o.print();//cj
var f = o.print();//java的内存分析模型来分析js内存模型。函数也有地址,f就指向print指向的函数对象,
f();//undefined,
/*this是运行时决定不是代码写的时候决定,this写在函数中,哪个对象调用函数, ,this就指向那个对象,  f() === window.f(),所以未定义。
*/

var ele = document.getElementById("id");
ele.addEventListener("click",function(){
    console.log(this);//this永远指向dom元素,就是引发事件的对象,
})

//call,apply都是函数对象有的,动态改变函数调用的对象
function log(a){
    console.log(this[a]);
}
log("name");  //this是window对象,global
log.call(o,"name");//cj,相当于o.log("name"),不让window调用log函数让o来调用log函数,call方法第一个参数是要调用这个函数的对象,第二个是参数。

function log(a,b){
     console.log(this[a]);//通过中括号访问函数对象的成员属性,
     console.log(this[b]);
}
log("name","");
log.apply(o,"name","age");
log.apply(o,["name","age"]); //apply接受参数是数组,call是一个一个传递

log.call(this,)  == this.log()





function p(){
    this.name = "111";//函数的this是调用这个函数的对象
}
var d = p();//单纯函数执行不会返回对象,除非函数里面返回了函数就是返回子类对象,
console.log(d.name);//name未定义
var o ={}; p.call(o);//相当于o.p(), this就指向o,然后增加一个属性name console.log(o.name); // 111 function Person(name,age){ this.name = name; this.age = age; } var p1 = new Person ("cj",22);//new出来的,当然p1就是这个函数类的实例化对象 console.log(p1 instanceof Person); //true //自定义new function New(f){ //f 是个函数。f 构造器函数 var o = {"__proto__":f.prototype}; //o.__proto__ 指向函数f的prototype return function(){//返回函数,可以不写形参,按照java父类子类思维,每次return的函数地址是不一样的,就像return多个子类对象, //o.name = arguments[0]; //o.age = arguments[1]; f.apply(o,arguments);//o调用f,f函数里面的this就是o了,o就有了f函数的成员属性和值 return o;//函数执行时返回o对象 } } var p2 = New(Person)("xx",33);//New(Person)返回函数,("xx",33)函数执行返回o console.log(p2.name);//xx console.log(p2 instanceof Person);//true </script>
  // java的面向对象思维来分析js函数闭包而已,函数成员属性的作用范围也用java父子类思维来分析
  //函数的嵌套,产生的闭包的作用范围,类似于父类子类对象堆的作用域范围。return函数出去,每次return都是一个新的函数地址(产生新的闭包)
  function New(f){ //类1
      var o = {"__proto__":f.prototype};  //对象2,对象的组合
      return function(){ //类3
          f.apply(o,arguments);           
        return o;//函数执行时返回o对象
      }
  }
  var temp = New(Person); //window.New(Person),函数1执行,return function()返回函数3地址就是对象3
  var p2 = temp("11",11);  //window.temp("11",11),函数3执行, ,返回对象2,
  var p3 = temp("22",22);// 函数3执行,返回对象2, p2,p3是同一个对象o
  console.log(p2.name);  //22
  console.log(p3.name);  // 22
  
  
  function New(f){//对象1
      return function(){//对象3
          var o = {"__proto__":f.prototype};//对象2,对象的组合
          f.apply(o,arguments);          
        return o;
      }
  }
  var temp = New(Person);//返回对象3 
  var p2 = temp("11",11); //函数3执行,返回对象2,这个对象
  var p3 = temp("22",22); 
  console.log(p2.name);  //11
  console.log(p3.name);  // 22
原文地址:https://www.cnblogs.com/yaowen/p/6846849.html