Javascript进阶必会
概念:
局部块函数声明:
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进阶必会的更多相关文章
- JavaScript进阶之高阶函数篇
JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...
- #笔记#JavaScript进阶篇一
#JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...
- 4、JavaScript进阶篇①——基础语法
一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...
- JavaScript 进阶(一)JS的"多线程"
这个系列的文章名为“JavaScript 进阶”,内容涉及JS中容易忽略但是很有用的,偏JS底层的,以及复杂项目中的JS的实践.主要来源于我几年的开发过程中遇到的问题.小弟第一次写博客,写的不好的地方 ...
- JavaScript进阶(一)
OK接下来,我们再次梳理一遍js并且提高一个等级. 众所周知,web前端开发者需要了解html和css,会只用html和css创建一个漂亮的页 面,但是这肯定是不够的,因为它只是一个静态的页面,我们 ...
- Javascript 进阶 面向对象编程 继承的一个样例
Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承.这篇使用一个样例来展示js怎样面向对象编程.以及怎样基于类实现继承. 1. ...
- JavaScript进阶(九)JS实现本地文件上传至阿里云服务器
JS实现本地文件上传至阿里云服务器 前言 在前面的博客< JavaScript进阶(八)JS实现图片预览并导入服务器功能>(点击查看详情)中,实现了JS将本地图片文件预览并上传至阿里云服务 ...
- JavaScript进阶(十一)JsJava2.0版本
JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...
- Javascript 进阶 面向对象编程 继承的一个例子
Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...
随机推荐
- Flutter免费(视频)教程汇总
Flutter学习导航 Flutter简介: Flutter可以轻松快速地构建漂亮的移动应用程序. Flutter是谷歌的移动应用SDK,用于短时间内在iOS和Android上制作高质量的原生界面应用 ...
- .Net Core自动化部署系列(一):Jenkins + GitLab
项目进行微服化改造后系统发布就变得愈为重要,因为持续集成导致部署变得越来越频繁,人工部署带来的一些问题日渐凸显,大家可能都有被系统部署线问题困扰过的经历. 本篇我们将会使用Jenkins+Gitlab ...
- ELK 学习笔记之 Logstash基本语法
Logstash基本语法: 处理输入的input 处理过滤的filter 处理输出的output 区域 数据类型 条件判断 字段引用 区域: Logstash中,是用{}来定义区域 区域内,可以定义插 ...
- Linux的命令(待更新)
本文说明: ①本文格式: 序号.命令 详解,用文字或者代码 举例: ②本文索引: 1.设置IP 2.ps -aux 3.grep 4. | 1.设置IP 如果本地网卡eth0已经启动,就可以用下面的命 ...
- springboot项目目录结构
idea新建springboot项目 按默认下一步至完成,默认目录结构如下 pom.xml文件内容如下 <?xml version="1.0" encoding=" ...
- sprigboot项目中配置xml格式的logback
slf4j依赖和logback的依赖 idea中springboot项目的resources目录下新建logback-spring.xml文件,内容大致如下: <?xml version=&qu ...
- 从零开始入门 K8s | 可观测性:监控与日志
作者 | 莫源 阿里巴巴技术专家 一.背景 监控和日志是大型分布式系统的重要基础设施,监控可以帮助开发者查看系统的运行状态,而日志可以协助问题的排查和诊断. 在 Kubernetes 中,监控和日志 ...
- parse_args(argsparse):python和命令行之间的交互
初始化 假设我们创建一个“argp.py”的文件. import argparse # 引入模块 # 建立解析对象 parser = argparse.ArgumentParser() parser. ...
- UVA - 1160 X-Plosives
A secret service developed a new kind of explosive that attain its volatile property only when a spe ...
- Kafka 介绍
Apache Kafka是一个分布式流式平台. 流平台有三个关键的能力: 发布和订阅记录流,类似于消息队列或企业消息传递系统. 使用容错耐用的方式存储记录流. 记录产生时处理数据. Kafka主要是用 ...