//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); // 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); //
console.log(p3.name); // 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); //
console.log(p3.name); //

js---13 this call apply的更多相关文章

  1. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

  2. index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined

    使用 webpack 编译 Vue 项目时出现报错: index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined ...

  3. js中call和apply的实现原理

    js中call和apply的实现原理            实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...

  4. 使用JS简单实现一下apply、call和bind方法

    使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...

  5. (转)js的call和apply

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  6. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  7. js中call、apply、bind那些事2

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  8. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  9. js基础篇——call/apply、arguments、undefined/null

    a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 ...

  10. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

随机推荐

  1. 5. MongoDB基本操作语句

    转自:http://blog.51cto.com/shanqiangwu/1653577 #MongoDB中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”. ...

  2. [BZOJ3670] [NOI2014] 动物园 解题报告 (KMP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅, ...

  3. WEB前端开发工程师成长计划

    今天看到一篇文章,感觉很不错,于是转了过来,同时也给自己规划一个方向. [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提 ...

  4. caffe(11) 图像数据转换成db文件

    在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致.而在caffe中经常使用的数据类型是lmdb或leveldb,因此就 ...

  5. ES6学习笔记(十五)Generator函数的异步应用

    1.传统方法 ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 Generator 函数将 JavaScript 异步编程带入了一个全新的阶段. ...

  6. 紫书 习题 10-5 UVa 1213(01背包变形)

    这里就是01背包多了一维物品个数罢了 记得不能重复所以有一层循环顺序要倒着来 边界f[0][0] = 1 #include<cstdio> #include<vector> # ...

  7. 【C语言】打印1到最大的n位数

    //打印1到最大的n位数 //输入数字n,按顺序打印出从1到最大的n位十进制数. 比方:输入3.则打印出1.2一直到最大的3位数999 #include <stdio.h> #includ ...

  8. BZOJ 2242 [SDOI2011]计算器 BSGS+高速幂+EXGCD

    题意:id=2242">链接 方法: BSGS+高速幂+EXGCD 解析: BSGS- 题解同上.. 代码: #include <cmath> #include <c ...

  9. 为什么用卷积滤波,而不是非常easy的在频率领域内进行数据的频率处理

    卷积.为了更好的"动态"滤波. 问题来了.为什么用卷积滤波.而不是非常easy的在频率领域内进行数据的频率处理? 为了强调我觉得的答案,已经用blog标题给出了.卷积.为了更好的& ...

  10. 酱油记:GDKOI2018

    GDKOI2018,走出机房的第六场考试 DAY0 这一次GDKOI,第一次在广州二中考,第一次住在柏高酒店(住宿条件杠杠的!),晚上就到对面的万达广场吃了顿烤肉,到老师那里开会,然后就回酒店睡了 D ...