javaScript 基础知识汇总 (十)
1、New Function
语法:let func = new Function ([arg1[, arg2[, ...argN]],] functionBody)
//无参数示例:
let sayHi = new Function('alert ("Hello")');
sayHi();//Hello
//有参数示例
let sum = new Function('a','b','return a + b');
alert(sum(1,2));//3
2、调度:setTimeout 和 setInterval
setTimeout 将函数的执行推迟到一段时间后再执行
setInterval 让函数间隔一定时间周期性执行
setTimeout 语法:let timerId = setTimeout(func|code, delay[, arg1, arg2...])
func|code 想要执行的代码或者代码字符串
delay:执行前的延时 单位为毫秒
arg1,arg2..:参数列表,ie9 以下不支持
无参数示例
function sayHi(){
alert('hello');
}
setTimeout(sayHi,1000);//1秒后执行
带参数示例
function sayHi(pthrase,who){
alert(phrase+','+who);
}
setTimeou(sayHi,1000,"Hello","Jhon");//Hello,John
箭头函数的形式
setTimeout(()=>alert('hello'));
用claerTimeout 来取消调度
setTimeout 在调用时会返回一个定时器id
cleatTimeout 使用的方法
let timerId = setTimeout(....);
clearTimeout(timerId);
示例:
let timerId = setTimeout(() => alert("never happens"), );
alert(timerId); // 定时器 id
clearTimeout(timerId);
alert(timerId); // 还是那个 id 没变(并没有因为调度被取消了而变成 null)
setInterval
语法: let timerId = setInterVal(func|code,delay,[,arg1,arg2...])
用法和setTimeout 相同,但是执行的方式不一样,这个是每间隔相同的时间执行一次。
递归版 setTimeout
let i = ;
setInterval(function() {
func(i);
}, ); let i = ;
setTimeout(function run() {
func(i);
setTimeout(run, );
}, );
setTimeout(...,0);
这种用法,虽然时间为0,但是还是会被延时执行,放到一般函数后执行
3、装饰和转发,call/apply
1) 使用“func.call" 作为上下文
语法: func.call(context,arg1,arg2,...)
function sayHi() {
alert(this.name);
}
let user = { name: "John" };
let admin = { name: "Admin" };
// 使用 call 将不同的对象传递为 "this"
sayHi.call( user ); // this = John
sayHi.call( admin ); // this = Admin
function say(phrase) {
alert(this.name + ': ' + phrase);
}
let user = { name: "John" };
// user becomes this, and "Hello" becomes the first argument
say.call( user, "Hello" ); // John: Hello
let worker = {
someMethod() {
return ;
},
slow(x) {
alert("Called with " + x);
return x * this.someMethod(); // (*)
}
};
function cachingDecorator(func) {
let cache = new Map();
return function(x) {
if (cache.has(x)) {
return cache.get(x);
}
let result = func.call(this, x); // "this" 现在被正确的传递了
cache.set(x, result);
return result;
};
}
worker.slow = cachingDecorator(worker.slow); // 现在让他缓存起来
alert( worker.slow() ); // 生效了
alert( worker.slow() ); // 生效了, 不会调用原始的函数了。被缓存起来了
为了清楚地说明,让我们更深入地了解 this 是如何传递的:
在经过装饰之后,worker.slow 现在是包装器 function (x) { ... }。
因此,当执行 worker.slow() 时,包装器将 作为参数并且 this=worker(它是点之前的对象)。
在包装器内部,假设结果尚未缓存,func.call(this, x) 将当前的 this (=worker) 和当前参数 (=)
传递给原始方法。
2)使用"func.apply" 来传递多参数
语法:func.apply(context,args)
function say(time, phrase) {
alert(`[${time}] ${this.name}: ${phrase}`);
}
let user = { name: "John" };
let messageData = ['10:00', 'Hello']; // 成为时间和短语
// user 成为 this,messageData 作为参数列表传递 (time, phrase)
say.apply(user, messageData); // [10:00] John: Hello (this=user)
4、函数绑定
丢失this
在JavaScript中this很容易就会丢失。一旦一个方法被传递到另一个对象分离的地方-----this就会丢失
丢失示例:
let user = {
firstName:"Jhon",
sayHi(){
alert(`Hello,${this.firstName}!`);
}
};
setTimeout(user.sayHi,1000);//Hello,undefined!
这种情况下上下文丢失
解决方案一:包装层
let user = {
firstName:"John",
sayHi(){
alert(`Hello,${this.firstName}!`);
}
};
setTimeout(function(){
user.sayHi();//Hello,Jhon!
},1000);
这种方式存在一种风险,就是在1秒之内如果user被改之后,操作的user可能就不是之前的
解决方案二:bind
基本的语法: let boundFunc = func.bind(context);
func.bind(context) 的结果是一个特殊的像函数一样的“外来对象”,它可以像函数一样被调用并且透明的将 调用传递给 func 并设置 this=context。
换句话说,调用 boundFunc 就像是调用 func 并且固定住了 this。
举个例子,这里 funcUser 将调用传递给了 func 同时 this=user:
let user = {
firstName: "John"
};
function func() {
alert(this.firstName);
}
let funcUser = func.bind(user);
funcUser(); // John
处理对象的方法
let user = {
firstName: "John",
sayHi() {
alert(`Hello, ${this.firstName}!`);
}
};
let sayHi = user.sayHi.bind(user); // (*)
sayHi(); // Hello, John!
setTimeout(sayHi, ); // Hello, John!
javaScript 基础知识汇总 (十)的更多相关文章
- javaScript 基础知识汇总 (十二)
1.属性的标志和描述符 属性的标志 对象属性除value外还有三个特殊属性,即标志 writable ----如果为true,则可以修改,否则它只是只读的. enumerable ----如果为tru ...
- javaScript 基础知识汇总 (十五)
1.模块简介 什么是模块: 模块就是一个文件,一个脚本,通过关键字export 和 import 交换模块之间的功能. export 关键字表示在当前模块之外可以访问的变量和功能. import 关键 ...
- javaScript 基础知识汇总 (十四)
1.回调 什么是回调? 个人理解,让函数有序的执行. 示例: function loadScript(src,callback){ let script = document.createElemen ...
- JavaScript基础知识汇总
1. 图片热区: <img src="logo.jpg" usemap="#logo"> <map id="logo" n ...
- javaScript 基础知识汇总(三)
1.循环:while 和 for while 循环 while(condition){ //代码 循环体 } do ... while 循环 let i =0; do { //循环体 }while( ...
- javaScript 基础知识汇总(六)
1.基本类型与对象的区别 基本类型:是原始类型的中的一种值. 在JavaScript中有6中基本类型:string number boolean symbol null undefined 对 ...
- javaScript 基础知识汇总(五)
1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...
- javaScript 基础知识汇总(二)
1.运算符 术语或者叫法:一元运算符.二元运算符.运算元(参数) let x=0; x=5+2; //5和2为运算元,“+” 为二元运算符: x=-x; //"-" 为一元运算符 ...
- javascript 基础知识汇总(一)
1.<script> 标签 1) 可以通过<script> 标签将javaScript 代码添加到页面中 (type 和language 属性不是必须的) 2)外部的脚本可以通 ...
随机推荐
- springboot 配置热部署 及 热部署后依旧是404的坑
springboot配置热部署的教程网上一大堆: 个人喜欢这种方式: https://www.cnblogs.com/winner-0715/p/6666579.html 本文主要强调的是,大家如果配 ...
- Nginx笔记总结十九:nginx + fancy实现漂亮的索引目录
编译:./configure --prefix=/usr/local/nginx --add-module=../ngx-fancyindex-master 配置: location / { fanc ...
- a, b = a, a+b 和a=b b=a+b的区别
n,a,b=0,0,1 while n<5: print(b) a,b=b,a+b n=n+1 和 n,a,b=0,0,1 while n<5: print(b) a=b b=a+b n= ...
- unicode编码与解码
unicode编码与解码,代码如下 package com.fenqiguanjia.api.services; /** * Created by daixianjun on 2017/9/3. */ ...
- Spring中@Resorce和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- JAVA WEB期末项目第二阶段成果
我们做的系统是一个基于Java web与MySQL的食堂订餐系统 班级: 计科二班 小组成员:李鉴宣.袁超 1.开发环境 开发编辑器使用:Visual Studio Code 数据库使用:MySQL8 ...
- win7图片只显示图标不显示预览图解决方案
问题描述: win7上图片只显示图标,不显示缩略图:不管是调节小图.中图还是大图或者其他均不显示:而且这种情况下使用截图工具截下来的图片都不自动带上扩展名:情况如下图: 解决方案: 打开计算机-> ...
- 【转】从技术和成本算笔账,自动驾驶L3过渡到L4有多难?
转自:http://www.sohu.com/a/160479216_121787 从技术和成本算笔账,自动驾驶L3过渡到L4有多难? 2017-07-28 09:34 英伟达解决方案架构师程亚冰认为 ...
- 教你win7关闭开机动画,大幅度加快开机时间
Win7系统如何关闭开机动画 Win7系统开机动画关闭教程,以前我们说过很多种帮助Win7开机加速的方法,比如减少Win7开机启动的程序.服务或计划任务等.不过这些都优化都是针对已经进入Win7系统后 ...
- windowserver 2012安装openssh
下载https://github.com/PowerShell/Win32-OpenSSH/releases解压放到C:\Program Files\OpenSSH-Win64 进入到C:\Progr ...