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

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. stl文件格式

    http://wenku.baidu.com/view/a3ab7a26ee06eff9aef8077b.html [每个三角形面片的定义包括三角形各个定点的三维坐标及三角形面片的法矢量[三角形的法线 ...

  2. Spring-Aop入门

    (一)Aop术语定义 1.通知(advice) 通知定义了切面要做什么工作,即调用的方法,同时定义了什么时候做这些工作,即以下五种类型 (1)前置通知(Before) :在目标方法调用之前执行切面方法 ...

  3. php多图上传问题笔记

    图片上传好用插件有,比如 uploadify  ueditor html5的各种ajax上传插件,大部分都是异步,返回只是true之类,有些时候需要上传图片需要一起上传,其实可以通过操作流程来避免这个 ...

  4. Windows下用VMware安装Ubuntu虚拟机

    安装: http://jingyan.baidu.com/article/0320e2c1ef9f6c1b87507bf6.html 全屏: http://jingyan.baidu.com/arti ...

  5. java基础总结——基础语法1

    一.标示符 二.关键字 三.java基本数据类型 3.1 常量 ● 常量表示不能改变的数值. ● java中常量的分类: 1. 整数常量.所有整数 2. 小数常量.所有小时 3. 布尔型常量.较为特有 ...

  6. selenium python的使用(二)

    1.selenium获取到的信息是 把页面加载完毕之后 获取异步加载的html源码 html=driver.find_element_by_xpath("/html").get_a ...

  7. flex 弹性布局

         采用 flex 布局的元素称为容器,其所有子元素称为项目.常用: 容器上可以设置六个属性:flex-direction.flex-wrap.flex-flow.justify-content ...

  8. Emmet使用

    emmet官方文档 [翻译]Emmet (ZenCoding) 缩写语法 <!-- ul>li.item$*5 --> <ul> <li class="i ...

  9. 轻量级ORM-Fluentdata入门

    Fluent Data 入门 由 Primates 根据互联网资源整理FluentData 是微型 ORM(micro-ORM)家族的一名新成员,旨在比大型 ORM(full ORM)更加易用.Flu ...

  10. 由于某IP大频率提交评论导致服务器宕机

    早上突然收到dnspod的宕机通知(好久没收到了,有点手足无措). 服务器在上午10:40时达到85%.uptime显示cpu利用率达到35.不宕才怪. 按照之前的经验,应该是触发一个特别耗CPU的处 ...