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

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. USACO翻译:USACO 2014 JAN三题(1)

    USACO 2014 JAN 一.题目概览 中文题目名称 滑雪场设计 滑雪降速 滑雪场评级 英文题目名称 skidesign slowdown skilevel 可执行文件名 skidesign sl ...

  2. QT的程序开机自启动方法

    /home/fa/.config/lxsession/LXDE/autostart文件最后添加脚本

  3. 【iCore3 双核心板_FPGA】实验二十七:基于SDRAM的TFT驱动器的设计

    实验指导书及代码包下载: http://pan.baidu.com/s/1c2dZihE

  4. WINDOWS SERVER 2008 RD服务器搭建

    RD服务器详细名称为:RemoteDesktop Server 远程桌面服务器.但微软觉得这名字很怪诞,所以中文名用:终端服务器来代替这个叫法:TerminalServiceServer 在介绍搭建之 ...

  5. 掌握Thinkphp3.2.0----标签库

    1.什么是内置标签?什么是标签扩展库? Cx.class.php 和 Html.class.php 2.怎么加载非内置标签,怎么使用? 两种方式加载 3.怎么扩展自定义的标签? 仿照Html.clas ...

  6. yii2 查询去重

  7. C++笔记----构造函数与析构函数(三)

    1.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段:初始化段. 普通计算段 2.对象成员及其初始化 #include<iostream> using ...

  8. iOS 10的正确解锁方式

    在iOS 10上,锁屏状态通过按下电源键点亮屏幕之后,用手指轻触Home键,实际上手机是已经解锁了的,不信请看如下截图: 虽然手机已经解锁,但与iOS 9不同的是,此时手机还处在解锁界面而没有进入主屏 ...

  9. dynamoDb aws config aws_access_key_id aws_secret_access_key golang

    how to set  aws_access_key_id awscfg := aws.NewConfig().WithRegion(config.Region).WithCredentials(cr ...

  10. 什么是ValueStack

    转载自:http://www.cnblogs.com/zyw-205520/archive/2012/09/12/2681346.html Strut2的Action类通过属性可以获得所有相关的值,如 ...