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 基础知识汇总 (十)的更多相关文章

  1. javaScript 基础知识汇总 (十二)

    1.属性的标志和描述符 属性的标志 对象属性除value外还有三个特殊属性,即标志 writable ----如果为true,则可以修改,否则它只是只读的. enumerable ----如果为tru ...

  2. javaScript 基础知识汇总 (十五)

    1.模块简介 什么是模块: 模块就是一个文件,一个脚本,通过关键字export 和 import 交换模块之间的功能. export 关键字表示在当前模块之外可以访问的变量和功能. import 关键 ...

  3. javaScript 基础知识汇总 (十四)

    1.回调 什么是回调? 个人理解,让函数有序的执行. 示例: function loadScript(src,callback){ let script = document.createElemen ...

  4. JavaScript基础知识汇总

    1. 图片热区: <img src="logo.jpg" usemap="#logo"> <map id="logo" n ...

  5. javaScript 基础知识汇总(三)

    1.循环:while 和 for while 循环 while(condition){ //代码 循环体 } do ... while  循环 let i =0; do { //循环体 }while( ...

  6. javaScript 基础知识汇总(六)

    1.基本类型与对象的区别 基本类型:是原始类型的中的一种值. 在JavaScript中有6中基本类型:string number  boolean  symbol  null  undefined 对 ...

  7. javaScript 基础知识汇总(五)

    1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...

  8. javaScript 基础知识汇总(二)

    1.运算符 术语或者叫法:一元运算符.二元运算符.运算元(参数) let x=0; x=5+2; //5和2为运算元,“+” 为二元运算符: x=-x; //"-" 为一元运算符 ...

  9. javascript 基础知识汇总(一)

    1.<script> 标签 1) 可以通过<script> 标签将javaScript 代码添加到页面中 (type 和language 属性不是必须的) 2)外部的脚本可以通 ...

随机推荐

  1. CF-1117C-Magic Ship

    二分 C - Magic Ship GNU C++11 Accepted 31 ms 1700 KB #include "bits/stdc++.h" using namespac ...

  2. 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= ...

  3. 导入项目@override 报错处理

    将项目导入MyEclipse中后总有错:@override总是报错,没关系,不用着急,偶来告诉你解决办法. @override报错,鼠标放上去让你移除,是因为你的JDK版本太低,一般JDK是要在1.6 ...

  4. 添砖加瓦:MySQL分布式部署

    1.集群环境  管理节点(MGM):这类节点的作用是管理MySQLCluster内的其他节点,如提供配置数据,并停止节点,运行备份等.由于这类节点负责管理其他节点的配置,应该在启动其他节点之前启动这类 ...

  5. 【问】:和=在map里面的区别

  6. Eclipse-project-clean

    project--->clean的原理 eclipse  --->project  ----->clean... 选项将工程中的.class文件删除,同时重新编译工程,类似于jbui ...

  7. Python 异常处理中的 esle

    前言 我们知道,在Python中,我们是用try- -excetp- - 来做异常处理的,但Python 有别于其他语法的是在异常处理中还提供了else的处理场景,是的,你没看错,就是在条件判断if- ...

  8. CSS——NO.3(CSS选择器)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  9. 【5min+】保持程序健康的秘诀!AspNetCore的HealthCheck

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  10. dns原理介绍及实践问题总结

    1 问题引入: a) 域名劫持: dns过程中某个环节被攻击/篡改,导致dns结果为劫持者的服务器.例如竞争对手将你方的app下载地址篡改为他方的app下载地址. b) 对现网用户进行监控时,发现个别 ...