javascript编程中this解析
一.为什么要使用this?
this 提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将 API 设计得更加简洁并且易于复用。随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用 this则不会这样。
二.this 是什么?
this在函数中被使用,一般情况下this指的是调用this所在函数的对象。即 this === 调用this所在函数对象。
三.this应用场景
1.当this所在的函数为对象一个健值时,这个函数中的this是指向该健值所在的对象。
2.当this所在的函数不属于对象的健值,此时直接调用该函数时,该函数中的this指向window,严格模式下指向undefined
3.构造函数中this指向new出来这个对象。
4.函数应用了 appaly、call、bind 方法,函数this指向这三个方法所指定的对象。
总结:this不存在于函数中:严格报错,非严格执行window。其余情况this位于函数中,以上几种情况。
四.apply、call、bind 改变this指向
1.Function.prototype.apply 和 Function.prototype.call 方法用法其实一致的,Function.prototype.apply传入两个参数,第一个参数为this所指向的对象,第二个参数为函数形参 - 为一个数组。Function.prototype.call 传入n个参数(n>=1),第一个参数为this指向对象,后面的参数为函数所需形参。
let obj = {
number:0
};
function sum(){
let sum = this.number;
console.log(sum); //0
console.log(arguments); //两次输出一致为一个类数组
for(let i = 0,length = arguments.length;i<length;i++){
sum += arguments[i];
}
return sum
}
console.log(sum.apply(obj,[1,2,3])); //6
console.log(sum.call(obj,1,2,3)); //6
2.Function.prototype.bind 也可传入n个参数,第一个参数为this指向对象,后面参数为形参,此方法和call不同之处在于 bind是在函数声明赋值给一个变量进行保存时进行绑定this指向对象和传入参数,而call 和 apply 为函数调用时候进行绑定。
注:通过bing绑定this指向对象之后,无法在函数调用时候再通过apply或者call进行更改。
let obj = {
number:0
};
let sum = function(){
let sum = this.number;
console.log(sum); //0
console.log(arguments); //两次输出一致为一个类数组
for(let i = 0,length = arguments.length;i<length;i++){
sum += arguments[i];
}
return sum
}.bind(obj,1,2,3);
console.log(sum()); //6
console.log(sum(4));//10 绑定时通过bind传入的为默认参数,调用函数时还可以传入参数。
注意:
箭头函数不绑定Arguments 对象
箭头函数只能用于非方法函数
箭头函数不能作为构造函数
箭头函数没有property属性
javascript编程中this解析的更多相关文章
- 实践javascript美术馆的小案例,学习到的东西还是蛮多的,包括javascript编程中的预留退路、分离javascript、以及实现向后兼容等
javascript美术馆(改进2) 一.javascript编程过程中的好习惯 1.实现预留退路 js被禁掉,图片也可以显示出来,href属性带有图片路径 <script src=" ...
- 你不知道的this—JS异步编程中的this
Javascript小学生都知道了javascript中的函数调用时会 隐性的接收两个附加的参数:this和arguments.参数this在javascript编程中占据中非常重要的地位,它的值取决 ...
- javascript语言中的一等公民-函数
简介 在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,又或是作 ...
- JavaScript闭包其一:闭包概论 函数式编程中一些基本定义
http://www.nowamagic.net/librarys/veda/detail/1707前面介绍了作用域链和变量对象,现在再讲闭包就容易理解了.闭包其实大家都已经谈烂了.尽管如此,这里还是 ...
- Java并发编程中的设计模式解析(二)一个单例的七种写法
Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...
- java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法
1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...
- Javascript中eval解析的json的几种用法
eval解析json字符串可用的三种方式都可以实现... <!DOCTYPE html> <html> <head> <meta charset=" ...
- 解析Python编程中的包结构
解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...
- 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
随机推荐
- Pandas基础知识(二)
Pandas的索引对象 index的对象是不可以修改的如执行index[1] = 'f',会报错"Index does not support mutable operations" ...
- python 删除非空文件夹
import os import shutil os.remove(path) #删除文件 os.removedirs(path) #删除空文件夹 shutil.rmtree(path) #递归删除文 ...
- localStorage,sessionStorage,cookie使用场景和区别
localStorage:HTML5新增的在浏览器端存储数据的方法.设置和获取localStorage的方法: 设置: localStorage.name = 'zjj'; 获取: localStor ...
- http://ctf.bugku.com/challenges#%E9%80%86%E5%90%91%E5%85%A5%E9%97%A8:bugku--逆向入门
文件是: 分析挺简单,主要是data urls知识点. 首先使用peid检测是否加壳,发现它居然是jpg文件.使用notepad++查看,结果如下. 嗯,百度一下子,知道了data ...
- 100-days: ten
Title: Emma Watson(艾玛·沃森), Keira Knightley(凯拉·奈特莉) among stars(众多明星之一) urging(竭力主张,呼吁某事) better pro ...
- GCD - Extreme (II) (欧拉函数妙用)
https://cn.vjudge.net/problem/UVA-11426 题意:求 解题思路:我们可以定义一个变量dis[n],dis[n]意为1~(n-1)与n的gcd(最大公约数)的总和,那 ...
- Codeforces Round #552 (Div. 3) A题
题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...
- 新建一个项目,如何使用abp用户登录系统
1.首先参考Framework.Web里的packages.config,把相关的包都安装好. 2.App_Start文件夹下的xxxModule.cs和Startup.cs拷过来,修改下命名空间. ...
- mybatis进阶--一对多查询
首先,我们还是先给出一个需求:根据订单id查询订单明细——我们知道,一个订单里面可以有多个订单的明细(需求不明确的同学,请留言或者去淘宝网上的订单处点一下就知道了).这个时候,一个订单,对应多个订单的 ...
- Pandas处理丢失数据
1.创建含NaN的矩阵 >>> dates = pd.date_range(', periods=6) >>> df = pd.DataFrame(np.arang ...