云顶娱乐-云顶娱乐游戏平台官网
做最好的网站
当前位置: 云顶娱乐 > 云顶娱乐 > 正文

云顶娱乐:JS宗旨类别,4主要更新

时间:2019-10-05 16:40来源:云顶娱乐
拨开闭包神秘的面纱 咱俩先看一个闭包的例子: function foo() { let a = 2; function bar() { console.log( a ); } returnbar; } let baz = foo(); baz(); 1 2 3 4 5 6 7 8 9 10 11 12 13 function foo() {     let a = 2;      

拨开闭包神秘的面纱

咱俩先看一个闭包的例子:

function foo() { let a = 2; function bar() { console.log( a ); } return bar; } let baz = foo(); baz();

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo() {
    let a = 2;
 
    function bar() {
        console.log( a );
    }
 
    return bar;
}
 
let baz = foo();
 
baz();

大家肯定都写过类似的代码,相信广东营伙也领略这段代码应用了闭包,but, Why does the closure be generated and Where is closure?

来,大家渐渐深入分析:

先是必需先明了闭包是如何,技术剖判出闭包为何爆发和闭包到底在哪?

当贰个函数能够记住并拜会到其所在的词法成效域及效果与利益域链,极度重申是在其定义的功效域外实行的拜候,此时该函数和其上层实施上下文共同构成闭包。

供给断定的几点:

  1. 闭包一定是函数对象(wintercn大大的闭包考证)
  2. 闭包和词法功能域,效用域链,垃圾回收机制相关
  3. 当函数一定是在其定义的成效域外进行的走访时,才发出闭包
  4. 闭包是由该函数和其上层实行上下文共同构成(那一点稍后作者会申明)

闭包是怎么样,大家说清楚了,上边我们看下闭包是怎样发生的。

接下去,笔者暗许你早就读过作者事先的两篇作品 本来JavaScript内部是这么运维的 和 根本搞懂JavaScript功效域 , 提出先举行阅读驾驭JS实施机制和作用域等皮之不存毛将焉附文化,再精通闭包,不然恐怕会分晓的不彻底。

今昔自己假使JS引擎实践到那行代码

let baz = foo();

那会儿,JS的效能域气泡是那样的:

云顶娱乐 1

其不经常候foo函数已经试行完,JS的排放物回收机制应该会活动将其标识为”离开情状”,等待回收机制下一次试行,将其内存举办释放(标识清除)。

但是,大家精心看图中森林绿的箭头,咱们将bar的援引指向baz,正是这种引用赋值,阻止了排放物回收机制将foo进行回收,从而致使bar的整条作用域链都被保留下去

接下来,baz()实施,bar步入试行栈,闭包(foo)造成,此时bar中如故能够访谈到其父功能域气泡中的变量a。

那般说或者不是很清晰,接下去大家借助chrome的调治工具看下闭包发生的长河。

当JS引擎实践到那行代码let baz = foo();时:

云顶娱乐 2

图中所示,let baz = foo();曾经实践完,将要推行baz();,此时Call Stack中唯有全局上下文。

接下来baz();执行:

云顶娱乐 3

作者们能够观看,此时bar走入Call Stack中,何况Closure(foo)变成。

针对地方笔者关系的几点张开下表明:

  1. 上述第二点(闭包和词法功效域,效能域链,垃圾回收机制相关)我们应该都知晓了
  2. 上述第三点,当函数baz试行时,闭包才生成
  3. 上述第四点,闭包是foo,并非bar,非常多书(《you dont know JavaScript》《JavaScript高端程序设计》)中,都重申保留下去的援引,即上例中的bar是闭包,而chrome感觉被保存下来的密闭空间foo是闭包,针对这一点自身赞成chrome的判断(仅为本身的理解,如有差异观点,迎接来研商)

反馈

  1. 有人提到,在v3.5.5(最终的平静版本)中,bootstrap.min.css是123KB,而在新的4.0.0阿尔法bootstrap.min.css 中唯有88KB,值得庆祝。
  2. 有人反映说dashboard主旨并非完完全全的响应式,比方在tables->order history中。
  3. Bootstrap改成私下认可使用Sass,引起了大面积的切磋。
  4. 也可能有人表示,三个团体愿意放任旧手艺(不再协理IE8)用新本领(ES6)来重写库,值得爱惜。

    1 赞 4 收藏 3 评论

云顶娱乐 4

函数

function foo(){ } var foo = function(){ }

1
2
3
4
5
6
function foo(){
    
}
var foo = function(){
    
}

前面二个为函数证明,前者为函数表明式。typeof foo
的结果都以function。

JS大旨连串:浅谈 call apply 与 bind

2016/03/01 · JavaScript · apply, bind, call

初稿出处: 一像素   

在JavaScript中,call、apply和bind 是Function对象自带的五个艺术,那八个艺术的基本点功用是更换函数中的this指向,进而能够达到接花移木的作用。本文将对那三个主意进行详细的教师,并列出多少个特出应用场景。

 

call(thisArgs [,args…])


该格局能够传递三个thisArgs参数和贰个参数列表,thisArgs钦点了函数在运行期的调用者,相当于函数中的this对象,而参数列表会被传出调用函数中。thisArgs的取值有以下4种状态:

(1) 不传,恐怕传null,undefined, 函数中的this指向window对象

(2) 传递另一个函数的函数名,函数中的this指向这几个函数的援用

(3) 传递字符串、数值或布尔类型等基础项目,函数中的this指向其相应的包裹对象,如 String、Number、Boolean

(4) 传递多少个对象,函数中的this指向那一个指标

JavaScript

function a(){ console.log(this); //输出函数a中的this对象 } function b(){} //定义函数b var obj = {name:'onepixel'}; //定义对象obj a.call(); //window a.call(null); //window a.call(undefined);//window a.call(1); //Number a.call(''); //String a.call(true); //Boolean a.call(b);// function b(){} a.call(obj); //Object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function a(){
    console.log(this); //输出函数a中的this对象
}
function b(){} //定义函数b
 
var obj = {name:'onepixel'}; //定义对象obj
 
a.call(); //window
a.call(null); //window
a.call(undefined);//window
a.call(1); //Number
a.call(''); //String
a.call(true); //Boolean
a.call(b);// function b(){}
a.call(obj); //Object

那是call的大旨成效,它同意你在八个对象上调用该对象未有概念的不二诀窍,况且这一个法子能够访谈该对象中的属性,至于那样做有啥样利润,小编待会再讲,大家先看叁个简单的例证:

JavaScript

var a = { name:'onepixel', //定义a的属性 say:function(){ //定义a的方法 console.log("Hi,I'm function a!"); } }; function b(name){ console.log("Post params: "+ name); console.log("I'm "+ this.name); this.say(); } b.call(a,'test'); >> Post params: test I'm onepixel I'm function a!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var a = {
 
    name:'onepixel', //定义a的属性
 
    say:function(){ //定义a的方法
        console.log("Hi,I'm function a!");
    }
};
 
function b(name){
    console.log("Post params: "+ name);
    console.log("I'm "+ this.name);
    this.say();
}
 
b.call(a,'test');
>>
Post params: test
I'm onepixel
I'm function a!

当执行b.call时,字符串test作为参数字传送递给了函数b,由于call的效果,函数b中的this指向了对象a, 因而一定于调用了对象a上的函数b,而实际上a中尚无定义b 。

 

apply(thisArgs[,args[]])


apply和call的有一无二差距是第贰个参数的传递情势不一样,apply的第一个参数必需是一个数组,而call允许传递三个参数列表。值得你注意的是,就算apply接收的是多少个参数数组,但在传递给调用函数时,却是以参数列表的款式传递,大家看个轻易的事例:

JavaScript

function b(x,y,z){ console.log(x,y,z); } b.apply(null,[1,2,3]); // 1 2 3

1
2
3
4
5
function b(x,y,z){
    console.log(x,y,z);
}
 
b.apply(null,[1,2,3]); // 1 2 3

apply的那性情格很重点,大家会在上面包车型客车施用场景中涉及这么些天性。

 

bind(thisArgs [,args…])


bind是ES5新扩大的一个主意,它的传参和call类似,但又和call/apply有着显然的不如,即调用call或apply都会活动实施相应的函数,而bind不会实践相应的函数,只是重临了对函数的援引。粗略一看,bind就好像比call/apply要滞后一些,那ES5为啥还要引进bind呢?

事实上,ES5引进bind的的确目标是为了弥补call/apply的供应不可能满足要求,由于call/apply会对指标函数自动试行,进而产生它不可能在事件绑定函数中利用,因为事件绑定函数没有须要大家手动实施,它是在事件被触发时由JS内部自行施行的。而bind在贯彻转移函数this的还要又不会自动试行对象函数,因而能够健全的缓慢解决上述难点,看贰个例证就能够知晓:

JavaScript

var obj = {name:'onepixel'}; /** * 给document增加click事件监听,并绑定onClick函数 * 通过bind方法设置onClick的this为obj,并传递参数p1,p2 */ document.add伊夫ntListener('click',onClick.bind(obj,'p1','p2'),false); //当点击网页时接触并实施 function onClick(a,b){ console.log( this.name, //onepixel a, //p1 b //p2 ) }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var obj = {name:'onepixel'};
 
/**
* 给document添加click事件监听,并绑定onClick函数
* 通过bind方法设置onClick的this为obj,并传递参数p1,p2
*/
document.addEventListener('click',onClick.bind(obj,'p1','p2'),false);
 
//当点击网页时触发并执行
function onClick(a,b){
    console.log(
            this.name, //onepixel
            a, //p1
            b  //p2
    )
}

当点击网页时,onClick被触发试行,输出onepixel p1 p2, 表明onClick中的this被bind改换成了obj对象,为了对bind举办深刻的敞亮,我们来看一下bind的polyfill实现:

JavaScript

if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, //this在此间针对的是指标函数 fBound = function () { return fToBind.apply( //倘若外界执行var obj = new fBound(),则将obj作为最终的this,放弃采纳oThis this instanceof fToBind ? this //此时的this就是new出的obj : oThis || this, //纵然传递的oThis无效,就将fBound的调用者作为this //将通过bind传递的参数和调用时传递的参数进行统一,并作为最后的参数传递 aArgs.concat(Array.prototype.slice.call(arguments))); }; //将目的函数的原型对象拷贝到新函数中,因为目的函数有希望被当做构造函数使用 fBound.prototype = this.prototype; //重临fBond的引用,由外界按需调用 return fBound; }; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (!Function.prototype.bind) {
    Function.prototype.bind = function (oThis) {
        var aArgs = Array.prototype.slice.call(arguments, 1),
            fToBind = this, //this在这里指向的是目标函数
            fBound = function () {
                return fToBind.apply(
                    //如果外部执行var obj = new fBound(),则将obj作为最终的this,放弃使用oThis
                    this instanceof fToBind
                            ? this  //此时的this就是new出的obj
                            : oThis || this, //如果传递的oThis无效,就将fBound的调用者作为this
 
                    //将通过bind传递的参数和调用时传递的参数进行合并,并作为最终的参数传递
                    aArgs.concat(Array.prototype.slice.call(arguments)));
            };
 
        //将目标函数的原型对象拷贝到新函数中,因为目标函数有可能被当作构造函数使用
        fBound.prototype = this.prototype;
 
        //返回fBond的引用,由外部按需调用
        return fBound;
    };
}

选取场景一:承接


世家知晓,JavaScript中从不诸如Java、C#等高端语言中的extend 关键字,由此JS中绝非承接的概念,假诺必供给承袭的话,call和apply能够完结那么些功用:

JavaScript

function Animal(name,weight){ this.name = name; this.weight = weight; } function Cat(){ Animal.call(this,'cat','50'); //Animal.apply(this,['cat','50']); this.say = function(){ console.log("I am " + this.name+",my weight is " + this.weight); } } var cat = new Cat(); cat.say();//I am cat,my weight is 50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Animal(name,weight){
   this.name = name;
   this.weight = weight;
}
 
function Cat(){
    Animal.call(this,'cat','50');
  //Animal.apply(this,['cat','50']);
 
   this.say = function(){
      console.log("I am " + this.name+",my weight is " + this.weight);
   }
}
 
var cat = new Cat();
cat.say();//I am cat,my weight is 50

当通过new运算符发生了cat时,Cat中的this就对准了cat对象(关于new运算符的教授,请参见:),而继续的要紧是在于Cat中实施了Animal.call(this,’cat’,’50’) 那句话,在call元帅this作为thisArgs参数传递,于是Animal方法中的this就本着了Cat中的this,而cat中的this指向的是cat对象,所以Animal中的this指向的正是cat对象,在Animal中定义了name和weight属性,就约等于在cat中定义了这么些属性,因而cat对象便具备了Animal中定义的属性,进而达到了持续的目标。

 

使用场景二:冯谖三窟


在讲下边包车型地铁开始和结果后边,大家首先来认知一下JavaScript中的三个非规范专门的学业术语:ArrayLike(类数组/伪数组)

ArrayLike 对象即具备数组的一有的行为,在DOM中早已显示出来,而jQuery的凸起让ArrayLike在JavaScript中山大学放异彩。ArrayLike对象的精密在于它和JS原生的Array类似,不过它是不管三七二十一营造的,它来自开垦者对JavaScript对象的扩大,也正是说:对于它的原型(prototype)我们得以Infiniti制订义,而不会传染到JS原生的Array。

ArrayLike对象在JS中被广大应用,比方DOM中的NodeList, 函数中的arguments都是类数组对象,那几个指标像数组同样存款和储蓄着每三个因素,但它从不操作数组的法门,而大家能够透过call将数组的有些方法移接到ArrayLike对象,进而实现操作其成分的目标。比如咱们能够如此遍历函数中的arguments:

JavaScript

function test(){ //检查实验arguments是不是为Array的实例 console.log( arguments instanceof Array, //false Array.isArray(arguments) //false ); //剖断arguments是或不是有forEach方法 console.log(arguments.forEach); //undefined // 将数组中的forEach应用到arguments上 Array.prototype.forEach.call(arguments,function(item){ console.log(item); // 1 2 3 4 }); } test(1,2,3,4);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function test(){
    //检测arguments是否为Array的实例
    console.log(
            arguments instanceof Array, //false
            Array.isArray(arguments)  //false
    );
    //判断arguments是否有forEach方法
    console.log(arguments.forEach); //undefined
 
    // 将数组中的forEach应用到arguments上
    Array.prototype.forEach.call(arguments,function(item){
        console.log(item); // 1 2 3 4
    });
 
}
test(1,2,3,4);

除了这一个之外,对于apply来说,大家地点提到了它唯有的三个风味,即apply接收的是数组,在传递给调用函数的时候是以参数列表传递的。 这么些特点让apply看起来比call 后起之秀超过前辈,比方有那样两个现象:给定一个数组[1,3,4,7],然后求数组中的最大体素,而你明白,数组中并不曾获得最大值的艺术,日常景况下,你需求经过编写制定代码来兑现。而大家知道,Math对象中有二个获得最大值的方法,即Math.max(), max方法需求传递一个参数列表,然后回到这个参数中的最大值。而apply不仅能够将Math对象的max方法应用到其余对象上,还足以将八个数组转化为参数列表传递给max,看代码就会看清:

JavaScript

var arr = [2,3,1,5,4]; Math.max.apply(null,arr); // 5

1
2
3
var arr = [2,3,1,5,4];
 
Math.max.apply(null,arr); // 5

以上正是call和apply相比杰出的多少个应用场景,熟识精晓那几个技术,并把那一个特色应用到您的实际上项目中,会使您的代码看起来越来越深刻!

2 赞 12 收藏 评论

云顶娱乐 5

H5 Crash 难题大致

下图是 H5 Crash 的大约流程图:

云顶娱乐 6

鉴于前端不可能捕捉到页面 Crash 的景况和储藏室,可是 H5 页面上产生的荒唐会传送到 Java 和更底层的 Native 直到容器极度退出,在剥离的那一刻,容器会将旅社写入到日志中,当下一次开荒容器时(也可能是定期报告)就可以申报那个旅馆新闻。

闭包的艺术性

本人深信不疑那几个世界上最美的事物往往就存在我们身边,常常它并不是那么神秘,那么不可知,只是大家远远不够了一双开掘美的肉眼。

生活中,我们收取一段时间放缓脚步,细细品味我们所过的每一分每一秒,会收获到生存给大家的另一层乐趣。

闭包也千篇一律,它不是很神秘,反而是在大家的前后相继中随地可知,当我们静下心来,品味闭包的暗意,开采它散发出一种艺术的美,朴实、精巧又不失温婉。

云顶娱乐 7

细想,在我们效率域气泡模型中,成效域链让我们的中间bar气泡能够”见到”外面包车型地铁社会风气,而闭包则让大家的外界功用域能够”关心到”内部的气象成为可能。可知,只要大家愿意,内心世界和外围世界是能够相通的

Bootstrap 4重大更新,亮点解读

2015/08/25 · 基础技术 · 3 评论 · bootstrap

原作出处: CSDN/lowtech   

5月二十二日对Bootstrap来讲是个相当的小日子——不独有是项目四周年节日,也是因而了一年密集开采从此发表Bootstrap 4公开测量检验版的光阴。Bootstrap 4是一遍首要革新,大约涉及每行代码。

prototype

prototype属性是每一个函数都享有的特性,不过不是三个目的都富有的属性。举个例子

function Foo(){ } var foo = new Foo();

1
2
3
4
5
function Foo(){
    
}
 
var foo = new Foo();

里头Foo中有prototype属性,而foo未有。然而foo中的隐含的__proto__品质指向Foo.prototype。

foo.__proto__ === Foo.prototype

1
foo.__proto__ === Foo.prototype

怎会存在prototype属性?

Javascript里面全体的数据类型都以指标,为了使JavaScript完结面向对象的合计,就必要求能够完毕‘承接’使全数的对象连接起来。而哪些贯彻持续呢?JavaScript选择了近似C++,java的办法,通过new的点子来促成实例。

举个例证,child1,child2都以Mother的子女,且是双胞胎。(固然不是很好,不过依旧很能证实难题的)

function Mother(name){ this.name = name; this.father = 'baba'; } var child1 = new Mother('huahua'); var child2 = new Mother('huihui');

1
2
3
4
5
6
function Mother(name){
    this.name = name;
    this.father = 'baba';
}
var child1 = new Mother('huahua');
var child2 = new Mother('huihui');

要是有一天,开掘孩子的生父实在是Baba,那么就要对子女每叁个子女的father属性。

child1.father ='Baba'; console.log(child2.father) // baba

1
2
child1.father ='Baba';
console.log(child2.father) // baba

也正是说修改了中间一个亲骨血的father属性不会影响到下叁个,属性的值不可能分享。

好在这几个原因才建议来prototype属性,把要求分享的品质放到构造函数也正是父类的实例中去。

H5 Crash 原因初探

测量检验代码 库房地址云顶娱乐:JS宗旨类别,4主要更新。:

git clone ; cd demo;

1
2
git clone https://github.com/barretlee/h5crash.git;
cd demo;

注意: 代码必要在 Webview 容器中测量检验,PC 浏览器下不会出现十分。

H5 Crash 的缘故不太刚烈,然而从经验上剖断和查找,差不离归类为以下三种:

1. 内部存款和储蓄器难题

  • 测验方法:使用闭包,不断加码内部存储器量,看看扩充到哪个区间大小, webview 容器会出现十分
  • 测量检验地点:(微信、博客园恐怕其余客商端展开该页面包车型地铁顾客,能够点进去测验下,选取100M 内部存储器,不出意外,你的客户端会闪退。)

XHTML

<script> var Closure = function() { var _cache = []; var cache = 0; var add = function(size) { cache += size; size = size * 1024 * 1024; _cache.push(new Array(size).join('x')); refresh(); }; var refresh = function() { r.innerHTML = '内部存款和储蓄器消耗: ' + cache + 'M'; }; return { cache: cache + 'M', add: add, refresh: refresh } }; var closure = Closure(); </script> <button onclick="closure.add(1)">增添1M 内部存款和储蓄器消耗</button> <button onclick="closure.add(10)">增添10M 内部存款和储蓄器消耗</button> <button onclick="closure.add(20)">增加20M 内部存款和储蓄器消耗</button> <button onclick="closure.add(50)">扩大50M 内部存储器消耗</button> <button onclick="closure.add(100)">扩充 100M 内部存款和储蓄器消耗</button> <div id="r">内部存款和储蓄器消耗:0 M</div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<script>
var Closure = function() {
  var _cache = [];
  var cache = 0;
  var add = function(size) {
    cache += size;
    size = size * 1024 * 1024;
    _cache.push(new Array(size).join('x'));
    refresh();
  };
  var refresh = function() {
    r.innerHTML = '内存消耗: ' + cache + 'M';
  };
  return {
    cache: cache + 'M',
    add: add,
    refresh: refresh
  }
};
var closure = Closure();
</script>
 
<button onclick="closure.add(1)">增加 1M 内存消耗</button>
<button onclick="closure.add(10)">增加 10M 内存消耗</button>
<button onclick="closure.add(20)">增加 20M 内存消耗</button>
<button onclick="closure.add(50)">增加 50M 内存消耗</button>
<button onclick="closure.add(100)">增加 100M 内存消耗</button>
 
<div id="r">内存消耗:0 M</div>

留存的打扰:这种测量试验存在相当多的侵扰,举个例子设备项目、系统项目(iOS/Android)、和设备内部存款和储蓄器运转状态等。

2. Layers 数问题

Layers 数的获取相比较麻烦,Chrome Driver 未有提供该数量的接口,近年来也未有比较好的艺术得到这些数目。

  • 测量试验方法:通过分化的方法创造层,观望页面包车型地铁 Crash 意况
  • 测量检验地方:

XHTML

<style>.transform { transform: translateZ(0); } .animation { width:100px; height:100px; background:red; position:relative; animation:move 5s infinite; } @keyframes move { from {left:0px;} to {left:200px;} } </style> <script> var Layer = function() { function getType() { return document.querySelector('input:checked').value; }; return { createOne: function(index) { var div = document.createElement('div'); div.appendChild(document.createTextNode(index)); switch(getType()) { case 'opacity': div.style.cssText = "opacity:" + (index / 1000); break; case 'transform': div.className = 'transform'; break; case 'animation': div.className = 'animation'; break; case 'zindex': div.style.cssText = "position:relative; z-index:" + index; break; } document.body.appendChild(div); }, create: function(num) { [].slice.call(document.querySelectorAll('div')).forEach(function(item) { item.parentNode && item.parentNode.removeChild(item); }); while(num--) { this.createOne(num); } } } }; var layer = Layer(); </script> <strong>层类型: </strong> <ul> <li><label><input type="radio" checked name="type" value="opacity"> <span>通过 opacity 创设层</span></label></li> <li><label><input type="radio" name="type" value="transform"> <span>通过 transforms 创立层</span></label></li> <li><label><input type="radio" name="type" value="animation"> <span>通过 animation 创立层</span></label></li> <li><label><input type="radio" name="type" value="zindex"> <span>通过相对定位分层</span></label></li> </ul> <button onclick="layer.create(1)">创造 1 个层</button> <button onclick="layer.create(10)">创设 十三个层</button> <button onclick="layer.create(20)">创设 18个层</button> <button onclick="layer.create(50)">创建 肆18个层</button> <button onclick="layer.create(100)">创造 100 个层</button> <button onclick="layer.create(200)">成立 200 个层</button> <button onclick="layer.create(500)">创造 500 个层</button> <button onclick="layer.create(1000)">创设 一千个层</button> <button onclick="layer.create(两千)">创造 两千个层</button> <button onclick="layer.create(5000)">创设 六千个层</button> <button onclick="layer.create(一千0)">成立一千0 个层</button>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<style>.transform {
  transform: translateZ(0);
}
.animation {
  width:100px;
  height:100px;
  background:red;
  position:relative;
  animation:move 5s infinite;
}
 
@keyframes move {
  from {left:0px;}
  to {left:200px;}
}
</style>
<script>
var Layer = function() {
  function getType() {
    return document.querySelector('input:checked').value;
  };
  return {
    createOne: function(index) {
      var div = document.createElement('div');
      div.appendChild(document.createTextNode(index));
      switch(getType()) {
        case 'opacity':
          div.style.cssText = "opacity:" + (index / 1000);
          break;
        case  'transform':
          div.className = 'transform';
          break;
        case  'animation':
          div.className = 'animation';
          break;
        case  'zindex':
          div.style.cssText = "position:relative; z-index:" + index;
          break;
      }
      document.body.appendChild(div);
    },
    create: function(num) {
      [].slice.call(document.querySelectorAll('div')).forEach(function(item) {
        item.parentNode && item.parentNode.removeChild(item);
      });
      while(num--) {
        this.createOne(num);
      }
    }
  }
};
var layer = Layer();
</script>
 
<strong>层类型: </strong>
<ul>
  <li><label><input type="radio" checked name="type" value="opacity"> <span>通过 opacity 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="transform"> <span>通过 transforms 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="animation"> <span>通过 animation 创建层</span></label></li>
  <li><label><input type="radio" name="type" value="zindex"> <span>通过绝对定位分层</span></label></li>
</ul>
 
<button onclick="layer.create(1)">创建 1 个层</button>
<button onclick="layer.create(10)">创建 10 个层</button>
<button onclick="layer.create(20)">创建 20 个层</button>
<button onclick="layer.create(50)">创建 50 个层</button>
<button onclick="layer.create(100)">创建 100 个层</button>
<button onclick="layer.create(200)">创建 200 个层</button>
<button onclick="layer.create(500)">创建 500 个层</button>
<button onclick="layer.create(1000)">创建 1000 个层</button>
<button onclick="layer.create(2000)">创建 2000 个层</button>
<button onclick="layer.create(5000)">创建 5000 个层</button>
<button onclick="layer.create(10000)">创建 10000 个层</button>
  • 实质上,创立七个层,也是对内部存款和储蓄器的顶天而立消耗,页面 Crash 也许照旧因为内部存款和储蓄器消耗过大

3. 并发过多难题

  • 测量检验方法:尝试并发发出多样不相同的伸手(Fetch恳求、XH中华V伏乞、Script/CSS 财富伏乞),阅览页面 Crash 意况
  • 测量试验地点:

XHTML

<script> var Request = function() { function getType() { return document.querySelector('input:checked').value; }; function getResource() { var type = getType(); var resource = { fetch: '/', xhr: '/', script: '//g.alicdn.com/sd/data_sufei/1.5.1/aplus/index.js', css: '//g.alicdn.com/kg/global-util/1.0.3/index-min.css' }; return resource[type]; }; return { emitOne: function() { var url = getResource() + "?_云顶娱乐,t=" + (new Date * 1 + Math.random()); switch(getType()) { case 'fetch': return fetch('/'); case 'xhr': with(new XMLHttpRequest) { open('GET', url); send(); } return; case 'script': var s = document.createElement('script'); s.src = url; document.body.appendChild(s); return; case 'css': var s = document.createElement('link'); s.href = url; document.body.appendChild(s); } }, emit: function(num) { [].slice.call(document.querySelectorAll('script,link')).forEach(function(item) { item.parentNode && item.parentNode.removeChild(item); }); while(num--) { this.emitOne(); } } } }; var request = Request(); </script> <strong>供给类型: </strong> <ul> <li><label><input type="radio" checked name="type" value="fetch"> <span>使用 Fetch 发送哀告</span></label></li> <li><label><input type="radio" name="type" value="xhr"> <span>使用 XH福睿斯发送央浼</span></label></li> <li><label><input type="radio" name="type" value="script"> <span>并发需要脚本能源</span></label></li> <li><label><input type="radio" name="type" value="css"> <span>并发央浼样式财富</span></label></li> </ul> <button onclick="request.emit(1)">并发 1 个央浼</button> <button onclick="request.emit(10)">并发 13个诉求</button> <button onclick="request.emit(20)">并发 二十个哀告</button> <button onclick="request.emit(50)">并发 50个诉求</button> <button onclick="request.emit(100)">并发 100 个央浼</button> <button onclick="request.emit(500)">并发 500 个央浼</button> <button onclick="request.emit(一千)">并发 1000 个央浼</button>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<script>
var Request = function() {
  function getType() {
    return document.querySelector('input:checked').value;
  };
  function getResource() {
    var type = getType();
    var resource = {
      fetch: '/',
      xhr: '/',
      script: '//g.alicdn.com/sd/data_sufei/1.5.1/aplus/index.js',
      css: '//g.alicdn.com/kg/global-util/1.0.3/index-min.css'
    };
    return resource[type];
  };
  return {
    emitOne: function() {
      var url = getResource() + "?_t=" + (new Date * 1 + Math.random());
      switch(getType()) {
        case 'fetch':
          return fetch('/');
        case 'xhr':
          with(new XMLHttpRequest) {
            open('GET', url);
            send();
          }
          return;
        case 'script':
          var s = document.createElement('script');
          s.src = url;
          document.body.appendChild(s);
          return;
        case 'css':
          var s = document.createElement('link');
          s.href = url;
          document.body.appendChild(s);
      }
    },
    emit: function(num) {
      [].slice.call(document.querySelectorAll('script,link')).forEach(function(item) {
        item.parentNode && item.parentNode.removeChild(item);
      });
      while(num--) {
        this.emitOne();
      }
    }
  }
};
var request = Request();
</script>
 
<strong>请求类型: </strong>
<ul>
  <li><label><input type="radio" checked name="type" value="fetch"> <span>使用 Fetch 发送请求</span></label></li>
  <li><label><input type="radio" name="type" value="xhr"> <span>使用 XHR 发送请求</span></label></li>
  <li><label><input type="radio" name="type" value="script"> <span>并发请求脚本资源</span></label></li>
  <li><label><input type="radio" name="type" value="css"> <span>并发请求样式资源</span></label></li>
</ul>
 
<button onclick="request.emit(1)">并发 1 个请求</button>
<button onclick="request.emit(10)">并发 10 个请求</button>
<button onclick="request.emit(20)">并发 20 个请求</button>
<button onclick="request.emit(50)">并发 50 个请求</button>
<button onclick="request.emit(100)">并发 100 个请求</button>
<button onclick="request.emit(500)">并发 500 个请求</button>
<button onclick="request.emit(1000)">并发 1000 个请求</button>
  • 存在的侵扰:设备的类型、设备的 CPU 使用景况和互联网情况等。

编辑:云顶娱乐 本文来源:云顶娱乐:JS宗旨类别,4主要更新

关键词: