`
vipshichg
  • 浏览: 267387 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解密 JavaScript 中的 this

阅读更多

this的工作原理

如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象。

1
2
3
4
5
6
7
8
var parent = {
    method: function () {
        console.log(this);
    }
};
 
parent.method();
// <- parent

注意这种行为非常“脆弱”,如果你获取一个方法的引用并且调用,那么this的值不会是parent了,而是window全局对象。这让大多数开发者迷惑。

1
2
3
4
var parentless = parent.method;
 
parentless();
// <- Window

底线是你应该查看调用链,以理解被调用函数是一个对象的属性还是它自己。如果它被作为属性调用,那么this的值将变成该属性的对象,否则this的值将被指派为全局对象或window。如果在严格模式下,this的值将是undefined。

在被当作构造函数的情况下,当使用new关键字时,this将被指派为被创建的实例对象。

1
2
3
4
5
6
function ThisClownCar () {
  console.log(this);
}
 
new ThisClownCar();
// <- ThisClownCar {}

注意,在这种情况下没有办法识别出一个函数是否应该被用作构造函数,因此省略new关键字导致this的结果将是全局对象,就像我们上面看到的没有用parent调用的例子。

1
2
ThisClownCar();
// <- Window

 

改动this

.call、 .apply .bind 方法用来操作调用函数的方式,帮我们定义this的值和传递给函数的参数值。

Function.prototype.call 可以有任意数量的参数,第一个参数被分配给this,剩下的被传递给调用函数。

1
2
Array.prototype.slice.call([1, 2, 3], 1, 2)
// <- [2]

Function.prototype.apply 的行为和.call类似,但它传递给函数的参数是一个数组,而不是任意参数。

1
2
String.prototype.split.apply('13.12.02', ['.'])
// <- ['13', '12', '02']

Function.prototype.bind 创建一个特殊的函数,该函数将永远使用传递给.bind的参数作为this的值,以及能够分配部分参数,创建原函数的珂里化(curride)版本。

1
2
3
4
5
6
7
8
9
10
11
var arr = [1, 2];
var add = Array.prototype.push.bind(arr, 3);
 
// effectively the same as arr.push(3)
add();
 
// effectively the same as arr.push(3, 4)
add(4);
 
console.log(arr);
// <- [1, 2, 3, 3, 4]

 

作用域链中的this

在下面的例子,this将无法在作用域链中保持不变。这是规则的缺陷,并且常常会给业余开发者带来困惑。

1
2
3
4
5
6
7
8
9
10
11
function scoping () {
  console.log(this);
 
  return function () {
    console.log(this);
  };
}
 
scoping()();
// <- Window
// <- Window

有一个常见的方法,创建一个局部变量保持对this的引用,并且在子作用域中不能有同命变量。子作用域中的同名变量将覆盖父作用域中对this的引用。

1
2
3
4
5
6
7
8
9
10
function retaining () {
  var self = this;
 
  return function () {
    console.log(self);
  };
}
 
retaining()();
// <- Window

除非你真的想同时使用父作用域的this,以及当前this值,由于某些莫名其妙的原因,我更喜欢是使用的方法.bind函数。这可以用来将父作用域的this指定给子作用域。

1
2
3
4
5
6
7
8
function bound () {
  return function () {
    console.log(this);
  }.bind(this);
}
 
bound()();
// <- Window

 

3
9
分享到:
评论

相关推荐

    javascript的base64加密解密

    在JavaScript中,如果你需要对Base64编码的数据进行加密和解密,可以使用第三方库,如CryptoJS。这个库提供了各种加密算法,包括AES,可以方便地与Base64结合使用。例如,使用CryptoJS进行AES加密和解密: ```...

    aes加密解密js

    在JavaScript环境中,AES加密解密是实现数据安全传输和存储的重要手段。 标题"aes加密解密js"指出,我们关注的是在JavaScript环境中如何使用AES进行数据的加解密操作。在Web开发中,这通常是出于保护用户隐私、防止...

    [brainfuck解密工具](完整源代码程序)

    C/C++/asm/Javascript/Python/Rust+others中的脑洞解释器/翻译器的集合。JS版本包含一个交互式“IDE”,可以在纯JS或Wasm引擎之间进行选择。有两种JIT实现:在C++和Rust中。 Contents Intro Programs Languages asm ...

    AES+RSA加密解密(js和java互通)

    在这个项目中,我们关注的是"AES+RSA加密解密",这是两种广泛使用的加密算法,适用于JavaScript和Java环境中的前后端数据交换。下面将详细介绍这两个加密算法以及如何实现它们的互通。 **AES(Advanced Encryption ...

    AES JS加密JAVA解密

    在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程。下面我们将深入探讨这个主题。 首先,AES加密的基本原理是通过一个密钥和一系列复杂的...

    高级加密解密标准AES加密secret.js代码

    总之,`secret.js`文件中的代码展示了如何在JavaScript环境中使用AES加密解密。通过理解AES的工作原理和`crypto-js`库的使用,开发者可以为自己的项目提供可靠的数据加密解决方案。在实际开发中,还需要注意性能优化...

    AES加密解密js库

    AES加密解密js库,如标题所示,是用于在JavaScript环境中执行高级加密标准(AES)加密和解密操作的一种工具。AES是一种广泛采用的对称加密算法,它以高安全性、快速运算和易于实现而闻名。在Web开发中,AES加密可以...

    AES加密解密 JS html 前端

    在JS中,我们可以利用开源库crypto-js来实现AES的加密解密功能。crypto-js是一个完整的、易于使用的JavaScript密码学库,提供了多种加密算法,包括AES。首先,你需要在项目中引入crypto-js库,可以通过CDN链接或者...

    CryptoJS前台加解密

    CryptoJS是一个JavaScript库,专为在前端环境中执行加密和解密操作而设计。这个库支持多种加密算法,如AES(高级加密标准)、MD5(消息摘要算法5)和SHA(安全散列算法)系列,这些都是信息安全领域中常用的标准。...

    AES.rar_AES_aes encrypt decrypt_aes javascript_javascript

    在标题和描述中提到的"AES.rar_AES_aes encrypt decrypt_aes javascript_javascript",意味着我们将探讨如何使用JavaScript实现AES加密和解密。 AES算法基于块密码,它的基本操作是对128位的数据块进行加密。它支持...

    C#/JS AES字符串加密和解密

    本主题聚焦于"C#/JS AES字符串加密和解密",这是一种常用的方法,用于在前端JavaScript和后端C#之间安全地传输数据。 AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,因其...

    采用JS端来对字符串进行MD5,AES,Base64等加密解密

    在JavaScript中,我们可以使用`crypto-js`库来实现AES加密和解密。下面是一个简单的示例: ```javascript var CryptoJS = require("crypto-js"); var key = CryptoJS.lib.WordArray.random(16); // 随机生成16字节...

    Javascript Des加密

    在Web开发中,特别是前端与后端通信时,为了确保传输的数据不被未经授权的第三方窃取或篡改,开发者常使用DES加密技术对敏感信息进行加密,然后在后端解密。下面我们将深入探讨JavaScript中的DES加密及其应用。 ###...

    CryptoJS-AES-前后台交互加解密.zip

    **AES 加解密技术** ...总的来说,CryptoJS库提供了在JavaScript环境中实现AES加解密的能力,这对于前后台交互中的数据安全至关重要。通过理解AES的工作原理和CryptoJS的用法,开发者可以构建更加安全的应用程序。

    加密解密AES crypto的js封装代码

    **AES加密解密在JavaScript中的实现** AES(Advanced Encryption Standard),即高级加密标准,是一种广泛应用于数据加密的算法。在JavaScript环境下,我们可以使用各种库来实现AES加密和解密功能,其中`crypto-js`...

    CI加密,cryptojs解密, 使用aes-256-cbc

    在IT行业中,加密和解密是确保数据安全的重要手段,特别是在网络传输和存储时。本篇文章将深入探讨“CI加密”与“cryptojs解密”技术,以及如何使用AES-256-CBC(Advanced Encryption Standard with a 256-bit key ...

    基于web的前端,服务器端的aes加密解密

    本主题主要围绕"基于web的前端,服务器端的AES加密解密"展开,将深入探讨如何在前端JavaScript和后端实现AES加密与解密。 首先,让我们理解AES加密的基本原理。AES是一种分组密码,它将明文数据分成128位的块进行...

    JavaScript数组全解密

    JavaScript中的数组是编程中最基本且不可或缺的数据结构之一。在JavaScript中,数组不仅具有与其他语言相似的基本功能,还因其动态类型和灵活性,使得数组在各种场景下都有广泛的应用。这篇文章将全面解析JavaScript...

    JavaScript常用字符串与数组扩展函数小结_.docx

    在现代Web开发中,JavaScript是一种必不可少的语言。作为一门功能强大的脚本语言,它提供了大量的内置对象和方法来处理各种数据类型,其中最常用的就是字符串(`String`)和数组(`Array`)。为了提高代码的可读性和...

    javascript实现blob加密视频源地址的方法

    在JavaScript中,我们可以利用Blob对象来处理和加密视频源地址。以下是一个详细介绍如何使用JavaScript实现blob加密视频源地址的方法。 首先,我们需要理解HTML中的基本视频播放元素`&lt;video&gt;`。在提供的代码示例中...

Global site tag (gtag.js) - Google Analytics