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 |
相关推荐
在JavaScript中,如果你需要对Base64编码的数据进行加密和解密,可以使用第三方库,如CryptoJS。这个库提供了各种加密算法,包括AES,可以方便地与Base64结合使用。例如,使用CryptoJS进行AES加密和解密: ```...
在JavaScript环境中,AES加密解密是实现数据安全传输和存储的重要手段。 标题"aes加密解密js"指出,我们关注的是在JavaScript环境中如何使用AES进行数据的加解密操作。在Web开发中,这通常是出于保护用户隐私、防止...
C/C++/asm/Javascript/Python/Rust+others中的脑洞解释器/翻译器的集合。JS版本包含一个交互式“IDE”,可以在纯JS或Wasm引擎之间进行选择。有两种JIT实现:在C++和Rust中。 Contents Intro Programs Languages asm ...
在这个项目中,我们关注的是"AES+RSA加密解密",这是两种广泛使用的加密算法,适用于JavaScript和Java环境中的前后端数据交换。下面将详细介绍这两个加密算法以及如何实现它们的互通。 **AES(Advanced Encryption ...
在这个场景中,"AES JS加密JAVA解密" 提到的是使用JavaScript进行AES加密,然后在Java环境中对加密后的数据进行解密的过程。下面我们将深入探讨这个主题。 首先,AES加密的基本原理是通过一个密钥和一系列复杂的...
总之,`secret.js`文件中的代码展示了如何在JavaScript环境中使用AES加密解密。通过理解AES的工作原理和`crypto-js`库的使用,开发者可以为自己的项目提供可靠的数据加密解决方案。在实际开发中,还需要注意性能优化...
AES加密解密js库,如标题所示,是用于在JavaScript环境中执行高级加密标准(AES)加密和解密操作的一种工具。AES是一种广泛采用的对称加密算法,它以高安全性、快速运算和易于实现而闻名。在Web开发中,AES加密可以...
在JS中,我们可以利用开源库crypto-js来实现AES的加密解密功能。crypto-js是一个完整的、易于使用的JavaScript密码学库,提供了多种加密算法,包括AES。首先,你需要在项目中引入crypto-js库,可以通过CDN链接或者...
CryptoJS是一个JavaScript库,专为在前端环境中执行加密和解密操作而设计。这个库支持多种加密算法,如AES(高级加密标准)、MD5(消息摘要算法5)和SHA(安全散列算法)系列,这些都是信息安全领域中常用的标准。...
在标题和描述中提到的"AES.rar_AES_aes encrypt decrypt_aes javascript_javascript",意味着我们将探讨如何使用JavaScript实现AES加密和解密。 AES算法基于块密码,它的基本操作是对128位的数据块进行加密。它支持...
本主题聚焦于"C#/JS AES字符串加密和解密",这是一种常用的方法,用于在前端JavaScript和后端C#之间安全地传输数据。 AES(Advanced Encryption Standard),即高级加密标准,是一种广泛使用的对称加密算法,因其...
在JavaScript中,我们可以使用`crypto-js`库来实现AES加密和解密。下面是一个简单的示例: ```javascript var CryptoJS = require("crypto-js"); var key = CryptoJS.lib.WordArray.random(16); // 随机生成16字节...
在Web开发中,特别是前端与后端通信时,为了确保传输的数据不被未经授权的第三方窃取或篡改,开发者常使用DES加密技术对敏感信息进行加密,然后在后端解密。下面我们将深入探讨JavaScript中的DES加密及其应用。 ###...
**AES 加解密技术** ...总的来说,CryptoJS库提供了在JavaScript环境中实现AES加解密的能力,这对于前后台交互中的数据安全至关重要。通过理解AES的工作原理和CryptoJS的用法,开发者可以构建更加安全的应用程序。
**AES加密解密在JavaScript中的实现** AES(Advanced Encryption Standard),即高级加密标准,是一种广泛应用于数据加密的算法。在JavaScript环境下,我们可以使用各种库来实现AES加密和解密功能,其中`crypto-js`...
在IT行业中,加密和解密是确保数据安全的重要手段,特别是在网络传输和存储时。本篇文章将深入探讨“CI加密”与“cryptojs解密”技术,以及如何使用AES-256-CBC(Advanced Encryption Standard with a 256-bit key ...
本主题主要围绕"基于web的前端,服务器端的AES加密解密"展开,将深入探讨如何在前端JavaScript和后端实现AES加密与解密。 首先,让我们理解AES加密的基本原理。AES是一种分组密码,它将明文数据分成128位的块进行...
JavaScript中的数组是编程中最基本且不可或缺的数据结构之一。在JavaScript中,数组不仅具有与其他语言相似的基本功能,还因其动态类型和灵活性,使得数组在各种场景下都有广泛的应用。这篇文章将全面解析JavaScript...
在现代Web开发中,JavaScript是一种必不可少的语言。作为一门功能强大的脚本语言,它提供了大量的内置对象和方法来处理各种数据类型,其中最常用的就是字符串(`String`)和数组(`Array`)。为了提高代码的可读性和...
在JavaScript中,我们可以利用Blob对象来处理和加密视频源地址。以下是一个详细介绍如何使用JavaScript实现blob加密视频源地址的方法。 首先,我们需要理解HTML中的基本视频播放元素`<video>`。在提供的代码示例中...