JavaScript之深入对象(二)
上一篇随笔讲解了构造函数、原型及原型链相关的知识,今天让我们一起来探讨另一个问题:this。
一 this 的指向
1, 函数预编译过程中,this指向window
我们在讲解函数预编译过程的时候提到,函数在将要被执行时,会在[[scope]]属性中插入一个AO对象,AO对象包含了函数的形参、函数内声明的变量及子函数。实际上AO对象还有两个属性:this和arguments。
arguments用来存储接下来函数执行过程中接受到的实参列表。this用来接受函数中没有被声明就被赋值的变量(未声明访问将报错)。可以简单的理解为JavaScript的一种容错机制。这里的this就指向window,所以我们才说未声明的变量将被升级成window的属性。
function test(a,b){
c = 10;
console.log(arguments);
console.log(c === window.c);
}
test(1,2);
//Arguments{0:1,1:2;length:2,...} 类数组
//true
2, 全局作用域里this指向window。
JavaScript的执行环境就是window,所以在全局作用域里window === this。
console.log(this === window);//true
3, obj.method() 方法中的this指向obj
如果有对象调用方法,那么方法内的this将指向调用对象。
如果没有对象调用方法,即函数(方法)空执行,这里面的this还是将指向window。
var name = 'ru';
var obj = {
name:'ren',
method:function(){
console.log(this.name);
}
};
obj.method();//'ren'
var test = obj.method;
test();//'ru'
二 call/apply/bind
可以改变函数内部this的指向。
1, call(myThisarg,agr1,arg2,...)
call()方法使用一个指定的对象替代函数内原本的this。函数原有的参数依次添加在其后。如果第一个参数是null或者undefined,那么函数内部的this将不被改变。
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
/*
function Student(name,age,sex,classes,num){
this.name = name;
this.age = age;
this.sex = sex;
this.classes = classes;
this.num = num;
}
这种写法当然能够实现我们的功能,但Student构造函数的功能完美涵盖了Person,我们是否可以在创建Student实例时调用Person以简化代码呢?当然
*/
function Student(name,age,sex,classes,num){
Person.call(this,name,age,sex);
this.classes = classes;
this.num = num;
}
var student = new Student(1,2,3,4,5);
console.log(student);//{name:1,age:2,sex:3,classes:4,num:5}
var person = {
name : 'ren',
say : function(){
console.log(this.name);
}
};
var animal = {
name : 'dog'
};
person.say();//'ren'
animal.say();//Typerror:animal.say is not a function
//我们怎么才能让dog也能学ren一样说话呢?
person.say.call(animal);//'dog'
2, apply()
apply()方法的功能和call()完全一样。只是apply以数组形式接受原函数的参数。
var arr = [50,-1,-20,2,99,38];
//我们怎么拿到arr数组中最大或最小的那个数呢?你可能第一反应当然是数组的sort方法。但今天我们有一个使用更简单的方法!
Math.max.apply(null,arr);//
Math.min.apply(null,arr);//-20
//因为这里不涉及操作this的问题,所以第一个参数为null
3, bind()
bind()方法使用方式和call()完全一样,但功能上有所差别。bind执行会返回一个函数,这个函数内部的this已被改变,等待在合适的时候被调用。
call和apply是在函数执行时改变其this的指向,而bind是先改变函数内的this指向,然后返回一个新的函数。
var person = {
name : 'ren',
say : function (){
console.log(this.name);
}
};
var animal = {
name : 'dog'
};
person.say.call(animal);//'dog' 立即返回执行结果
var test = person.say.bind(animal); //返回一个函数
console.log(test);//fn
test();//'dog'
三 callee、caller
1,callee
arguments的一个属性,指向函数本身。
一般用在立即执行函数的递归调用。因为立即执行函数会忽略函数名,所以在递归调用时可以用callee来解决。
var factorial = (function(n){
if(n == 1){
return 1;
}else{
return n * arguments.callee(n - 1);
}
}(50));
2,caller
函数的一个属性,指向执行时的父函数。全局执行时,fn.caller == null。好像并没有什么卵用?
另外,这两个属性在严格模式下还不能使用。
四 ES5严格模式
关于ES5的严格模式这里就不详细讲解了,有兴趣的同学可以去这里:
https://www.cnblogs.com/snandy/p/3428171.html
JavaScript之深入对象(二)的更多相关文章
- javascript之BOM对象(二location对象)
一.location对象提供和当前加载的文档相关的信息还有一些导航功能.location对象是window对象的属性,同时也是document对象的属性.window.location和documen ...
- Unit05: JavaScript对象概述 、 常用内置对象一 、 常用内置对象二 、 常用内置对象三
Unit05: JavaScript对象概述 . 常用内置对象一 . 常用内置对象二 . 常用内置对象三 常用内置对象使用演示: <!DOCTYPE html> <html> ...
- 前端之JavaScript:JS之DOM对象二
继续JS之DOM对象二 前面在JS之DOM中我们知道了属性操作,下面我们来了解一下节点操作.很重要!! 一.节点操作 创建节点:var ele_a = document.createElement(' ...
- 二、JavaScript语言--JS基础--JavaScript进阶篇--JavaScript内置对象
1.什么事对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方 ...
- javascript (十二)对象二
JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. 属性和方法 属性是与对象相关的值. 方法是能够在对象上执行的动 ...
- Javascript基础回顾 之(二) 作用域
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- javascript中Date对象的应用——简易日历的实现
× 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 ...
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- JavaScript学习笔记——对象知识点
javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 //javascript属性的访问方法 ...
随机推荐
- IntelliJ IDEA 从入门到上瘾教程,2019图文版!
前言:IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话,Eclipse则称得上是石器时代的东西了. 其实笔者也是一枚从Eclipse转IDEA的探索者,随着近期 ...
- shiro 定义realm
public class UserRealm extends AuthorizingRealm { private UserService userService = new UserServiceI ...
- Shell-->变量的数值计算
1.----------------------------->>>>>文件改名,使用命令mv 2.----------------------------->&g ...
- React Native的APP打包教程
1.改软件的名称 2.改软件的图标 3.给做好的项目打成APP包 改软件的名称 找到项目的改名的位置 然后用记事本打开strings.xml,然后改自己想要的名字 改软件的图标 找到如下5个文件,然后 ...
- MSIL实用指南-Action的生成和调用
MSIL实用指南-Action的生成和调用 System.Action用于封装一个没有参数没有返回值的方法.这里生成需要Ldftn指令. 下面讲解怎生成如下的程序. class ActionTest ...
- GMTC 2019-前端夜话《聊聊前端工程师的成长和发展》会后简要总结
今天晚上去参加了winter主持的前端夜话:聊聊前端工程师的成长和发展圆桌论坛分享会,真的是收益颇多,这次的这个嘉宾阵容也是很有诚意的,在现在前端领域都是有一定影响力的嘉宾,嘉宾阵容也列一下: 主 ...
- NLP(二十四)使用LSTM构建生成式聊天机器人
准备 数据集:AIML数据集 下载数据集并用Notepad++打开,复制到txt文件中方便打开 代码实现 数据很少,训练轮次不多,结果不好,仅当示例 import numpy as np import ...
- 2019nc#10
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A Blackjack 点击查看 背包DP 32/109 补好了 B Coffee Chicken 点击查看 进入讨论 738/2992 通过 ...
- 快速幂 HDU 1061 Rightmost Digit *
Rightmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 通过对微信pc hook实现微信助手
本软件主要通过对pc端微信hook来实现的,微信版本2.6.8.52. 软件下载地址: http://blog.yshizi.cn/104.html 软件实现功能: 支持爆粉 支持文本消息群发 支持自 ...