了解完函数的调用区域是如何影响this 对象的,还有this 的各种绑定方式以及各种绑定方式的优先级后

最后一部分,来了解一下this 的一些例外情况

1、被忽略的this

例如在使用bind 方法时候进行函数柯里化,如果此时函数并没有打算绑定任何对象在bind() 方法的第一个参数可以传进一个 null充当占位符

例:

function foo(a,b){

    console.log("a: " + a + "b: " + b);
} var bar = foo.bind(null,3);//在绑定this 对象的同时传入第一个参数 bar(5);//在调用的时候再把第二个参数传进去

tips:
所谓函数柯里化,就是将一堆参数分配内部函数执行,最后再返回所有参数的结果
本人还没对柯里化深入认识只能说一点皮毛

如上例,将函数绑定在一个空对象中 就相等于把函数绑定在了全局环境中
这样做的方法比较危险 于是有了更安全的this 绑定 这一说法
把不需要做任何绑定的函数绑定在一个空对象中(此空对象是我们自己创建的对象)
例如:
通过Object.create(null) 创建一个空对象,这样创建比 {} 这样更空
因为省略了对象的prototype

function foo(a,b){

    console.log("a: " + a + "b: " + b);
} var empty = Object.create(null);//创建一个安全的 不会影响全局作用域的空对象 //把foo 函数绑定在空对象上执行 foo.apply(empty,[2,5]);//"a: " + 2 + "b: " + 5 var fun = foo.bind(empty,6); fun(8);

这样的执行会更加的安全

2、间接引用

间接引用通常会产生在函数引用的赋值上
例:

function foo(){
console.log(this.a);
} var obj1 = {
a: 23333,
foo: foo
} var obj2 = {
a: 6666,
} var a = "window here"; (obj2.foo = obj1.foo)();

注意这里还是那个问题,obj1 虽然是引用着函数foo

但是引用的内容仅仅是函数foo 的引用而已,this对象的绑定还是要看函数在哪里调用
此时函数 foo的调用位置在全局 因此在非严格模式下函数输出全局变量 a
如需绑定对象可以把上面的引用通过硬绑定的方式去执行

书上还写了一个修改函数原型的软绑定方法

    if (!Function.prototype.softBind) {
Function.prototype.softBind = function(obj) {
// 获取当前调用此方法的函数
var fn = this;
// 获取所有 softbind 除第一个以外的所有参数
var curried = [].slice.call( arguments, 1 ); //绑定函数
var bound = function() {
//当bound函数 被执行时 返回调用函数在指定对象的执行效果
//判断如下
return fn.apply(
//如果调用bound函数时 它的this 是指向了window 或者为false
//那么将它绑定在前期调用的绑定对象上
//如果不是
//放在调用它的对象上面执行
(!this || this === (window || global))?
obj : this,
curried.concat.apply(curried, arguments)
);
};
bound.prototype = Object.create(fn.prototype);
//修改bound 函数的原型对象为调用函数的原型 return bound;//返回bound 函数
};
}

这个方法意义在于不允许函数引用全局对象 而且比bind() 函数绑定好的一点是,当绑定完了一个对象时下面还可以绑定其他对象而不会永远地绑定在了一开始绑定的对象上

    function foo(){
console.log("this.name: " + this.name);
} var obj1 = {
name: "obj1"
} var obj2 = {
name: "obj2"
} var obj3 = {
name: "obj3"
} var bar1 = foo.softBind(obj1);//这里通过软绑定 将foo绑定在了obj1 上
bar1();//当全局变量执行时 它的this 便不再指向window而是指向了前期绑定好的obj1 上
//如果通过对象去调用呢?
obj2.bar1 = bar1;
obj2.bar1();//显示为 obj2 了 //再与原来的硬绑定 bind对比
var bar2 = foo.bind(obj1);
bar2();//结果是输出 obj1 obj2.bar2 = bar2;
bar2();//这里结果就不一样了 foo永远绑死在了obj1 上不能再改变了

最后介绍最后一个特殊的函数 es6 的箭头函数()=>
这个函数有一个特点就是 它的this 永远指向包含它的函数的this
看实例就懂

        function baz(){
//继承自baz
return (a)=>{
console.log(this.a);//输出外层函数能访问到的属性名
}
} var o1 = {
a: "o1 here"
} var o2 = {
a: "o2 here"
} var bat = baz.call(o2);
bat.call(o1,"a");//即使箭头函数在o1 内部调用 但是也只会输出baz调用对象的属性

其实在js 高程里面也说过一个问题 匿名函数的this 会指向了window
而es6 的箭头函数正好解决了这个问题 使this 更加完整了
而在es6 语法之前我们还有一个解决方案就是把 外部包含函数的this 对象保存在一个内部函数能够放到的变量上

然后内部函数再通过这个变量调用外部函数能访问的属性即可

this对象的介绍到这里介绍完了 我也要去撸一把特效之类的实际应用了,看太久理论真的会很累

【笔记】探索js 的this 对象 (第三部分)的更多相关文章

  1. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  2. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  3. 【笔记】探索js 的this 对象 (第一部分)

    最近在看 你不知道的javascript 这本书,在第二部分看到了一个比较重要的知识点 那就是 this对象的全面认识,于是做一下笔记 博主本人在看这本书之前也一直以为 this 是指一切引用类型的本 ...

  4. 【笔记】探索js 的this 对象 (第二部分)

    了解this 对象之后 我们明白了this 对象就是指向调用函数的作用域 那么接下来我们便要清除函数究竟在哪个作用域调用 找到调用的作用域首先要了解一下几点: 1.调用栈: 调用栈就是一系列的函数,表 ...

  5. HIbernate学习笔记3 之 缓存和 对象的三种状态

    一.hibernate一级缓存 *  hibernate创建每个Session对象时,都会给该Session分配一块独立的缓冲区,用于存放Session查询出来的对象,这个分配给session的缓存区 ...

  6. js高级程序设计(第三版)学习笔记(第一版)

    ecma:欧洲计算机制造商协会iso/iec:国际标准化和国际电工委员会 dom级别(10*)文档对象模型1:DOM核心(映射基于xml文档)与dom html(在dom核心基础上)2:对鼠标,事件, ...

  7. 读书笔记-你不知道的JS上-对象

    好想要对象··· 函数的调用位置不同会造成this绑定对象不同.但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂) 语法 对象声明有两个形式: 1.字面量 => var obj = ...

  8. 超全面的JavaWeb笔记day03<JS对象&函数>

    1.js的String对象(****) 2.js的Array对象 (****) 3.js的Date对象 (****) 获取当前的月 0-11,想要得到准确的月 +1 获取星期时候,星期日是 0 4.j ...

  9. 5月15日上课笔记-js中 location对象的属性、document对象、js内置对象、Date事件对象、

    location的属性: host: 返回当前主机名和端口号 定时函数: setTimeout( ) setInterval() 二.document对象 getElementById(); 根据ID ...

随机推荐

  1. oracle 导入dmp文件

    /*第1步:创建临时表空间  */ create temporary tablespace webdata_temp tempfile 'D:\oracle\product\10.2.0\oradat ...

  2. 201. Non Absorbing DFA

    题意好难看懂的说... 有限状态自动机DFA是这么一个有序组<Σ, U, s, T, phi>:Σ代表输入字符集,表示此自动机的工作范围:U代表所有的状态集合:s是初始状态:T是最终状态: ...

  3. CentOS6.5修改/etc/pam.d/sshd后root无法ssh登陆

    现象:由于公司需要服务器的登陆操作进行安全加固,同事为了省事,直接把CentOS7上的/etc/pam.d/sshd替换掉CentOS6.5上的/etc/pam.d/sshd,导致root用户ssh登 ...

  4. java.util.regex包下的Pattern和Matcher详解(正则匹配)

    java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果 ...

  5. ZOJ 3206 Disaster Area Reconstruction

    已经确定本题是错题了! ---------------------------------------------------------------- 这题有问题,不是后台数据水了就是出题人的做法是 ...

  6. CodeForces 738E Subordinates

    排序,构造. 相当于告诉我们一棵树$n$个节点,每个节点在哪一层,至少需要移动多少个节点,才能让这些节点变成一棵树. 按照层次排个序移动一下就可以了,优先选择那些不是$s$但是层次是$0$的节点,如果 ...

  7. 基于BeanNameViewResolver解析器,自定义视图

    概述 基于spring-mvc自定义视图,以BeanNameViewResolver作为解析器,以满足特殊需求. 本文以输出多个pdf文件的压缩文件,供前台下载的需求为例:但是不提供服务层实现. 实现 ...

  8. 最近公共祖先LCA(前置知识)

    1.前言 最近公共祖先(Least Common Ancestors),简称LCA,是由Tarjan教授(对,又是他)提出的一种在有根树中,找出某两个结点u和v最近的公共祖先问题. 2.什么是最近公共 ...

  9. 洛谷——P3909 异或之积

    P3909 异或之积 题目描述 对于A_1,A_2,A_3,\cdots,A_NA1​,A2​,A3​,⋯,AN​,求 (6\times \sum_{i=1}^N\sum_{j=i+1}^N\sum_ ...

  10. Codeforces 555 C. Case of Chocolate

    \(>Codeforces \space 555 C. Case of Chocolate<\) 题目大意 : 有一块 \(n \times n\) 的倒三角的巧克力,有一个人要吃 \(q ...