概念:

局部块函数声明:

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)

Javascript进阶必会的更多相关文章

  1. JavaScript进阶之高阶函数篇

    JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...

  2. #笔记#JavaScript进阶篇一

    #JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...

  3. 4、JavaScript进阶篇①——基础语法

    一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...

  4. JavaScript 进阶(一)JS的"多线程"

    这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践.主要来源于我几年的开发过程中遇到的问题.小弟第一次写博客,写的不好的地方 ...

  5. JavaScript进阶(一)

     OK接下来,我们再次梳理一遍js并且提高一个等级. 众所周知,web前端开发者需要了解html和css,会只用html和css创建一个漂亮的页 面,但是这肯定是不够的,因为它只是一个静态的页面,我们 ...

  6. Javascript 进阶 面向对象编程 继承的一个样例

    Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承.这篇使用一个样例来展示js怎样面向对象编程.以及怎样基于类实现继承. 1. ...

  7. JavaScript进阶(九)JS实现本地文件上传至阿里云服务器

    JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...

  8. JavaScript进阶(十一)JsJava2.0版本

    JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...

  9. Javascript 进阶 面向对象编程 继承的一个例子

    Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...

随机推荐

  1. 转:int整数除以int整数一定得到的是int整数(易忽视)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u014053368/article/de ...

  2. 云原生生态周报 Vol. 21 | Traefik 2.0 正式发布

    作者 | 浔鸣.心水.元毅.源三.衷源 业界要闻 CNCF 计划将 TOC 升至 11 人 技术监督委员会(TOC)是 CNCF 的三大核心管理机构之一,从 2020 年 1 月起,TOC 将从 9 ...

  3. ppt课件动手动脑实际验证

    1关于double精度 源代码:public class Doublejingdu { public static void main(String[] args) { System.out.prin ...

  4. java.util.Optional学习笔记

    java.util.Optional是Java 8新增的类,作为一个持有实例的容器类,可以帮我们把判空的代码写得更优雅,并且该类还提供了一些实用的api,官方文档在这里,接下来我们通过实战来学习吧: ...

  5. mysql 版本引起的 utf8mb4 问题(linux centos6.9下升级mysql)

    文字输入时候存在火星文或者表情,insert到低版本的mysql中一般会报错,所以我们需要将mysql版本升级到5.5.3及以上,高版本的mysql为我们提供了utf8mb4的编码,解决了这些复杂数据 ...

  6. java跬步积累

    1.eclipse自动生成get/set方法快捷键 alt+shift+s +r 2.eclipse自动生成等号左边快捷键 将光标移到:号右边,然后按Ctrl+1 3.补全代码快捷键 Alt+/ 4. ...

  7. 微信小程序 实现多行文字 超出部分省略号显示

    在开发小程序: 澳买 的 时候 遇到一个棘手的问题: 当搜索澳洲产品,获取产品列表的时候,有时候产品的名称翻译成中文特别长 我们不能全部在有限的列表里面把产品名都显示出来,这样格式不好控制,显示 出来 ...

  8. ng-cli新建项目

    tip:所有的命令是红色标签 , 链接为蓝色标签 使用ng-cli创建新的项目一般需要安装一些新的东西后才可以进行创建成功 1.需要先安装node.js  链接: https://nodejs.org ...

  9. Java 学习笔记之 Error和Exception的联系

    Error和Exception的联系: Error和Exception的联系 继承结构:Error和Exception都是继承于Throwable,RuntimeException继承自Excepti ...

  10. Java基础学习(七) - 异常处理

    1.异常概念 异常指的是程序在执行过程中出现的非正常的情况,导致JVM的非正常停止.在Java中,异常是一个类,产生异常就是创建异常对象并抛出一个异常对象. 异常指的并不是语法错误,语法错误,编译不会 ...