在前端网看了这么一篇文章,觉得讲得还不错,不深入但易懂,所以我这里把这个经典的问题也记下来。

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的更多相关文章

  1. 使用另一种方式实现js中Function的调用(call/apply/bind)

    在JavaScript中函数的调用可以有多种方式,但更经典的莫过于call和apply.call跟apply都绑定在函数上,他们两个的第一个参数意义相同,传入一个对象,他作为函数的执行环境(实质上是为 ...

  2. js中继承的方法总结(apply,call,prototype)

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 代码如下: <SPAN style="<SPAN style="FONT-SIZE ...

  3. JS中的call()方法和apply()方法用法总结

    原文引自:https://blog.csdn.net/ganyingxie123456/article/details/70855586 最近又遇到了JacvaScript中的call()方法和app ...

  4. JS中的call()方法和apply()方法用法总结(挺好 转载下)

    最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1. 每个函数都包含两个非继承而来的方法 ...

  5. js中bind,call,apply方法的应用

    最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...

  6. js中bind、call、apply函数的用法

    最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...

  7. js中bind、call、apply函数的用法 (转载)

    最近看了一篇不错的有关js的文章,转载过来收藏先!!! 最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web 的项目,然后在腾讯实习的时候用 j ...

  8. 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. ...

  9. 转:js中this、call、apply的用法

    (一)关于this首先关于this我想说一句话,这句话记住了this的用法你也就差不多都能明白了:this指的是当前函数的对象.这句话可能比较绕,我会举出很多例子和这句话呼应的!(看下文)1.首先看下 ...

  10. js中得call()方法和apply()方法的用法

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

随机推荐

  1. 在AngularJs中怎么设置请求头信息(headers)及不同方法的比较

    在AngularJS中有三种方式可以设置请求头信息: 1.在http服务的在服务端发送请求时,也就是调用http()方法时,在config对象中设置请求头信息:事例如下: $http.post('/s ...

  2. 如何获取google地图、baidu百度地图的坐标

    google:打开google地图-->查找目的地-->右键:此位置居中-->地址栏键入javascript:void(prompt('',gApplication.getMap() ...

  3. php遍历目录

    function zx($dir){ if(is_dir($dir)){ $filesnames = scandir($dir); foreach ($filesnames as $name) { i ...

  4. Tiddlywiki 维基程序使用手册

    文档 http://tiddlywiki.com/ http://web.nlhs.tyc.edu.tw/~lss/wiki/TiddlyWikiTutorialTW.html https://sit ...

  5. ajax下载多文件,并且打包 C#中 ,文件批下载zip

    //提交要下载的文件 $.ajax({ url:"/sub/ZipFile.aspx", data:"paras="+datas, type: 'HEAD', ...

  6. 微信 {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"}

    {"errcode":,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]" ...

  7. BT客户端实现 Peer协议设计

    与peer建立tcp连接后,首先发送handshake消息进行握手 handshake消息格式如下: 一个字节0x19 + 一个字符串'BitTorrent protocol' + 8 byte 保留 ...

  8. iOS JavaScriptCore与H5交互时出现异常提示

    在利用JavaScriptCore与H5交互时出现异常提示: This application is modifying the autolayout engine from a background ...

  9. vmware rdm

    RDM即裸磁盘映射,基本思想就是将host的磁盘直接映射给虚拟机使用   需要讨论的是: 1.rdm磁盘是否允许设置为共享,即可以映射给多个虚拟机使用(vmware不可用)   在 vSphere W ...

  10. CentOS 系统目录解析

    CentOS 系统目录解析 http://mp.weixin.qq.com/s?__biz=MzAxOTAzMzEzNg==&mid=202463614&idx=2&sn=51 ...