概念:

局部块函数声明:

ES5才承认有这个东西。

function f(){return 'global';}

function test(x){
var result = [];
if(x) {
function f(){return "local";}
result.push(f());
}
result.push(f());
}
test(true);
test(false);

虽然,Javascript是不存在块级作用域的,但是
这个输出仍然是不能确定的,并不是所有的Javascript环境会输出
[local local]和[local]。

为了避免这种情况,还是把局部块或者 嵌套子语句中。
如果确实要 根据条件确定函数,那么可以用var变量声明和 函数表达式来实现。

全局作用域和调用接收者:

var obj = {
hello: function (){
return "hello, "+ this.username;
},
username:"A";
};
var obj2 = {
hello:obj.hello,
username:"B";
};
obj2.hello();//hello, B

obj2调用的方法是 obj中的hello函数,但是接收者是obj2,obj2被绑定到this变量。

但是ES5的严格模式 把this变量的默认值绑定值设为undefined.

function hello(){
“use strict”;
return “hello, “+ this.username;
}

hello();//error: 不能读取undefined的username属性。

方法调用把方法所属的对象 作为调用接收者。
函数调用将全局对象(严格模式为undefined)作为调用接收者。

call指定调用接收者

函数对象的call方法可以用来调用其自身:

f.call(obj, arg1, arg2, arg3)等同于 obj.f(arg1, arg2, arg3)

例如 某个{} 的hasOwnProperty如果被删除
dict.foo = 1;
delete dict.hasOwnProperty

仍然可以用 {}.hasOwnProperty.call(dict, “foo”) //true
{}.hasOwnProperty.call(dict, “hasOwnProperty”) //false

apply 使用多个参数来调用函数

func1 = function (){…}

func1.apply(null, list);
如果func1没有使用this.

如果使用了,例如
buffer.append.apply(buffer, list);第一个参数用来指定接收者。

arguments变量隐式被保存到函数内

注意arguments处于嵌套的函数时,要用变量去读取。

bind

obj.forEach(obj2.add);
提取了obj.add但是接收者是 obj。

forEach的实现默认把全局对象作为了接收者。

obj.forEach(obj2.add, obj2)

假如forEach不支持指定接收者怎么办?
obj.forEach(function (s){
obj2.add(s);
obj2.join();
…..
}, obj2)

直接指定目标数组。

ES5直接支持这种做法:

obj.forEach(obj2.add.bind(obj2))
但bind不改变原来的函数调用接收者,而是新生成一个函数。
obj2.add === obj2.add.bind(obj2) //false
因此bind方法是安全的。

bind实现函数柯里化

function simpleURL(protocol, domain, path){
return protocol + “://”+domain+ “/” + path;
}
paths.map(simpleURL.bind(null, “http”, siteDomain));
将函数与其参数的一个子集进行绑定的技术成为函数柯里化。(currying,Haskell Curry)

最新文章

  1. 关于jqGrig如何写自定义格式化函数将JSON数据的字符串转换为表格各个列的值
  2. github的pull request是指什么意思?有什么用处
  3. C语言--指针问题_1
  4. 安装mysql 5.7 最完整版教程
  5. 16. Linux 文件目录权限
  6. MySQL Mysqlslap
  7. JS Call()与Apply()
  8. checkbox、radio控件和文字不对其
  9. jQuery选择器的分类之过滤选择器
  10. [2017-05-31]Abp介绍和经验分享-目录
  11. Git 入门篇
  12. 【★】KMP算法完整教程
  13. 面试中的DNS
  14. ISP PIPLINE (五) Denoise
  15. BUTXO详解
  16. WebSocket 跨域
  17. XML文件生成C++代码(基于rapidxml)
  18. Python中的base64模块
  19. socket编程函数
  20. DataGridView:DataGridView控件清空绑定的数据

热门文章

  1. WordPress后台地址路径修改方法
  2. golang1.13中重要的新特新
  3. Android Adapter的一些记录
  4. FreeSql 导航属性的联级保存功能
  5. asp.netcore 自动挡Docker Nginx Redis(滴滴滴,自动挡)
  6. selenium实现百度图片爬取
  7. Shell之三剑客
  8. ELK 学习笔记之 elasticsearch bool组合查询
  9. el-table实现行列拖拽
  10. CRS-2674: Start of 'ora.cssd' on 'rac2' failed 引发的rac集群服务起不来问题