js中的this,call及apply
在前端网看了这么一篇文章,觉得讲得还不错,不深入但易懂,所以我这里把这个经典的问题也记下来。
1:声明式函数与定义函数表达式
console.log(f1);//f1()
console.log(f2);//undefine
function f1(){
console.log('f1');
console.log(this);//window
}
var f2 = function(){
console.log('f2');
}
f1函数为声明式,f2为表达式;两者区别就在于函数的声明是在预处理的时候也就是构造执行环境的时候函数的定义和赋值都完成了,定义函数表达式是在js顺序执行到函数定义的时候赋值;当然,var声明变量的时候同样会提前,因此f2已经定义但未辅助打印了undefined。
2:函数里的this
执行刚刚的f1(),tihs被console出来是window;这是因为我们只做了一次实例化操作,都只是在实例化window对象,所以打印出来的this都是指向window;然后再看下面代码
var obj = {
name:"cjl",
job:"webFront",
show:function(){
console.log(this);//Object {name: "cjl", job: "webFront"}
}
};
var Obj1 = new Object();
Obj1.name = "cjl1";
Obj1.job = "webFront1";
Obj1.show = function(){
console.log(this);//Object {name: "cjl1", job: "webFront1"}
};
obj.show();
Obj1.show();
上面两段代码this都指向的实例化的一个对象,两者是等价的:第一种是用字面量的方式定义的一个对象; 第二种则是用new操作符(关键字)定义的。
new操作符的作用:
(1)、创建一个新的对象;
(2)、将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
(3)、执行构造函数中的代码(this.xxx就为这个新对象添加某些属性);
(4)、返回新的对象。
function Person(name,sex,age,job){
this.name = name;
this.sex = sex;
this.age = age;
this.job = job;
this.showPerson = function(){
console.log(this);//Person {name: "cjl", sex: "male", age: 25, job: "webFront"}
}
}
Person()
window.showPerson() //window对象
var person = new Person("cjl", "male", 25, "webFront")
person.showPerson()
如果不用new操作符实例化Person函数,this指向的还是window,否则就是指向返回的新的对象。我们一般把构造函数定义为首字母大写来模拟一个类的概念也以此区分普通函数。
3.apply和call
这两个方法经常在关于prototype原型的时候看到,但现在咱们先不管原型,单说这两个方法,我把它们理解成为扩展、继承的意思;传递参数的时候有点不同,apply方法只能传入一组参数数组,call方法按普通参数传递方法传递(我试过数组也行)
var name = "cjl"
function fn(name){
console.log(name);
console.log(this.name);
console.log(this);
}
fn("1");//1 cjl window
var obj = {
name:"cjl1"
};
fn.call(obj,"2");//2 cjl1 Object {name: "cjl1"}
我们定义了一个fn函数,接着定义了一个对象;call就相当于让obj也拥有了fn函数的方法。
js中的this,call及apply的更多相关文章
- 使用另一种方式实现js中Function的调用(call/apply/bind)
在JavaScript中函数的调用可以有多种方式,但更经典的莫过于call和apply.call跟apply都绑定在函数上,他们两个的第一个参数意义相同,传入一个对象,他作为函数的执行环境(实质上是为 ...
- js中继承的方法总结(apply,call,prototype)
一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 代码如下: <SPAN style="<SPAN style="FONT-SIZE ...
- JS中的call()方法和apply()方法用法总结
原文引自:https://blog.csdn.net/ganyingxie123456/article/details/70855586 最近又遇到了JacvaScript中的call()方法和app ...
- JS中的call()方法和apply()方法用法总结(挺好 转载下)
最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1. 每个函数都包含两个非继承而来的方法 ...
- js中bind,call,apply方法的应用
最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...
- js中bind、call、apply函数的用法
最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...
- js中bind、call、apply函数的用法 (转载)
最近看了一篇不错的有关js的文章,转载过来收藏先!!! 最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web 的项目,然后在腾讯实习的时候用 j ...
- JS中bind、call和apply的作用以及在TS装饰器中的用法
目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...
- 转:js中this、call、apply的用法
(一)关于this首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象.这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)1.首先看下 ...
- js中得call()方法和apply()方法的用法
方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方 ...
随机推荐
- 星外Xday提权
在星外不是安全模式的时候 但是又没有执行目录 有时候远程调用也不行对吧 winrar 有执行权限的时候C:\windows\IIS Temporary Compressed Files\ 这个目录有 ...
- javascript平时例子⑧(大屏轮播)
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- svn bug
Error:Can't find temporary directory:internal error 原因:服务器端,磁盘满了 repository and is not part of the c ...
- Memcache教程 Memcache零基础教程
Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...
- opencv的问题
opencv中图像文件格式是BRG的顺序 而QImage是RGB形式 H:色彩 S:深浅 s=0 只有灰度 V:明暗
- java 启动 shell脚本
run.sh p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "PingFang SC"; color: #000000 ...
- linux的sysctl基本配置
# Controls the use of TCP syncookiesnet.ipv4.tcp_syncookies = 1 # me write paramnet.ipv4.tcp_timesta ...
- php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名
1. current() 函数返回数组中的当前元素的值. 每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素. end() - 将内部指针指向数组中 ...
- webdriver零碎知识点
#零碎知识点,用于记录平时遇到的比较杂的知识点 driver.current_url 获取当前url phantomjs 实现无浏览器界面自动化测试(driver = webdriver.Phanto ...
- jvm 配置
# 内存参数MEMORY_OPTS="-Xms2048m -Xmx2048m -Xmn1024m -XX:MaxDirectMemorySize=2048m -XX:PermSize=256 ...