JavaScript会将全部变量和函数声明移动到它的浸染域的最前面,这就是所谓的变量晋升(Hoisting)。也就是说,无论你在什么处所声明变量和函数,表明器城市将它们移动到浸染域的最前面。因此我们可以先行使变量和函数,尔后声明它们。
可是,仅仅是变量声明被晋升了,而变量赋值不会被晋升。假如你不大白这一点,偶然则会堕落:
- console.log(y); // 输出undefined
- y = 2; // 初始化y
上面的代码等价于下面的代码:
- var y; // 声明y
- console.log(y); // 输出undefined
- y = 2; // 初始化y
为了停止BUG,开拓者应该在每个浸染域开始时声明变量和函数。
7. 柯里化
柯里化,即Currying,可所以函数变得越发机动。我们可以一次性传入多个参数挪用它;也可以只传入一部门参数来挪用它,让它返回一个函数行止理赏罚剩下的参数。
- var add = function(x) {
- return function(y) {
- return x + y;
- };
- };
- console.log(add(1)(1)); // 输出2
- var add1 = add(1);
- console.log(add1(1)); // 输出2
- var add10 = add(10);
- console.log(add10(1)); // 输出11
代码中,我们可以一次性传入2个1作为参数add(1)(1),也可以传入1个参数之后获取add1与add10函数,这样行使起来很是机动。
8. apply, call与bind要领
JavaScript开拓者有须要领略apply、call与bind要领的差异点。它们的配合点是第一个参数都是this,即函数运行时依靠的上下文。
三者之中,call要领是最简朴的,它等价于指定this值挪用函数:
- var user = {
- name: "Rahul Mhatre",
- whatIsYourName: function() {
- console.log(this.name);
- }
- };
- user.whatIsYourName(); // 输出"Rahul Mhatre",
- var user2 = {
- name: "Neha Sampat"
- };
- user.whatIsYourName.call(user2); // 输出"Neha Sampat"
apply要领与call要领相同。两者独一的差异点在于,apply要领行使数组指定参数,而call要领每个参数单独必要指定:
- apply(thisArg, [argsArray])
- call(thisArg, arg1, arg2, …)
- var user = {
- greet: "Hello!",
- greetUser: function(userName) {
- console.log(this.greet + " " + userName);
- }
- };
- var greet1 = {
- greet: "Hola"
- };
- user.greetUser.call(greet1, "Rahul"); // 输出"Hola Rahul"
- user.greetUser.apply(greet1, ["Rahul"]); // 输出"Hola Rahul"
行使bind要领,可觉得函数绑定this值,然后作为一个新的函数返回:
- var user = {
- greet: "Hello!",
- greetUser: function(userName) {
- console.log(this.greet + " " + userName);
- }
- };
- var greetHola = user.greetUser.bind({greet: "Hola"});
- var greetBonjour = user.greetUser.bind({greet: "Bonjour"});
- greetHola("Rahul") // 输出"Hola Rahul"
- greetBonjour("Rahul") // 输出"Bonjour Rahul"
9. Memoization
Memoization用于优化较量耗时的计较,通过将计较功效缓存到内存中,这样对付同样的输入值,下次只必要中内存中读取功效。
- function memoizeFunction(func)
- {
- var cache = {};
- return function()
- {
- var key = arguments[0];
- if (cache[key])
- {
- return cache[key];
- }
- else
- {
- var val = func.apply(this, arguments);
- cache[key] = val;
- return val;
- }
- };
- }
- var fibonacci = memoizeFunction(function(n)
- {
- return (n === 0 || n === 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
- });
- console.log(fibonacci(100)); // 输出354224848179262000000
- console.log(fibonacci(100)); // 输出354224848179262000000
代码中,第2次计较fibonacci(100)则只必要在内存中直接读取功效。
10. 函数重载 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|