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

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. jQuery用法小结

    jQuery加载1.$(document).ready()2.添加css样式:单个:$("p").css("color","red"); 多 ...

  2. hibernate_Restrictions用法

    方法   说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge &g ...

  3. 2016huasacm暑假集训训练四 数论_A

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125308#problem/F 题意:狼捉兔子,兔子躲在n个洞中一个,这n个洞围成一个圈,狼会从第0号洞开始,搜 ...

  4. 引用dll动态库,动态库中弹出对话框输入,将输入参数,作为变量继续调用。

    在做支付项目时,引用动态库,动态库弹出支付宝或者微信的支付码,继而接收.最终将结果返回给调用动态库方法. 首先,动态库接收的是一个string 类型的xml,如 public string Pay(s ...

  5. JS for循环 闭包

    对于for循环的闭包问题的理解,认为需要理解函数中的变量的作用域链的概念 另外提及下变量提升的概念 如下例子: var ar = [];for(var i=1:i<10; i++){ ar[i] ...

  6. swfit-计时器

    import UIKit class FourVC: UIViewController { var label:UILabel = UILabel() var index : Int = var ti ...

  7. find_elements后点击不了抓取的元素

    1.莫名其妙抓不到元素,要去看句柄,是不是没有切换 h=driver.current_window_handle nh=driver.window_handles for i in nh: if i! ...

  8. cloudera learning1:cloudera简介及安装

    cloudera分为两个部分:CDH和CM.CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera公司发布的Hadoop版本,封装了Apache Had ...

  9. 转摘 MySQL扫盲篇

    一下文章摘自:http://www.jellythink.com/archives/636 MySQL扫盲篇 2014-09-15 分类:MySQL / 数据库 阅读(1412) 评论(1)  为什么 ...

  10. const

     const int i = 20; int const i = 20; 这两个语句是完全相同的:const与int哪个写在前面都不影响语义. 所以: const int *p; int const ...