有趣的javascript
大约 2 分钟
有趣的javascript
1、-->符号
function countdown(n) {
while (n --> 0) // "n goes to zero"
alert(n);
blastoff();
}
--> 上面这段代码可以正常运行,循环会一直重复直到n趋于0,这当然不是ES6中的新特性
总结来说:对于一个变量赋值,发生了两个不同的动作:第一,*编译器* 声明一个变量(如果先前没有在当前作用域中声明过),第二,当执行时,*引擎* 在 *作用域* 中查询这个变量并给它赋值,如果找到的话。
2、什么是闭包
小姐姐的牵手、吃饭、购物.....这些属性。只能让我来访问 这就是闭包。
把小姐姐当做一个函数,在她的内部创建一个函数,然后return这个函数。当她new一个对象。返回的函数始就是是我。只有我能访问 小姐姐这个函数的所有属性。这就是闭包。
for ( var i = 0 ; i < 5; i++ ) {
setTimeout(function(){
console.log(i);
}, 0);
}
// 5 5 5 5 5
// 2
for ( var i = 0 ; i < 5; i++ ) {
(function(j){
setTimeout(function(){
console.log(j);
}, 0);
})(i);
// 这样更简洁
// setTimeout(function(j) {
// console.log(j);
// }, 0, i);
}
// 0 1 2 3 4
setTimeout(function(j) {
console.log(j);
}, 0, i);
// 3
for ( let i = 0 ; i < 5; i++ ) {
setTimeout(function(){
console.log(i);
},0);
}
// 0 1 2 3 4
// 4
var scope = 'global scope';
function checkscope(){
var scope = 'local scope';
console.log(scope);
}
// local scope
// 5
var scope = 'global scope';
function checkscope(){
var scope = 'local scope';
return function f(){
console.log(scope);
};
}
var fn = checkscope();
console.log(fn()); // local scope
// 6
var scope = 'global scope';
function checkscope(){
var scope = 'local scope';
return function f(){
console.log(scope);
};
}
checkscope()(); // local scope
var obj = {
name: 'tom',
sayName() {
console.log(this.name);
}
}
obj.sayName(); // tom
var obj = {
name: 'tom',
sayName() {
var name = 'alan';
console.log(this.name);
}
}
obj.sayName();// 'tom'
var name = 'jerry';
var obj = {
name : 'tom',
sayName(){
return function(){
console.log(this.name);
};
}
};
obj.sayName()(); // jerry
// var name = 'jerry';
var obj = {
name: 'tom',
sayName() {
var name = 'alan';
console.log(this.name);
}
};
var sayName = obj.sayName;
sayName(); // '' // jerry
function fun(a,b) {
console.log(b)
return {
fun: function(c) {
return fun(c,a);
}
};
}
var d = fun(0); // undefined
d.fun(1); // 2 0
d.fun(2); // 2 0
d.fun(3); // 2 0
var d1 = fun(0).fun(1).fun(2).fun(3);
// 2 undefined 2 0
// 2 1
// 2 2
var d2 = fun(0).fun(1); d2.fun(2);
// 2 undefined
// 2 0
// 2 1
// 2 1
d2.fun(3); // {fun: ƒ}
原文链接:https://juejin.cn/post/6911473286627098638
3、写出自己的filter方法
var arra1 = [1, 3, 4, 50, 22];
Array.prototype.myfilter = function (fn) {
var list = this;
var h = [];
for (var i of list) {
if(fn(i) == true){
h.push(i)
}
}
return h;
}
var arra = arra1.myfilter(
function (a) {
return a == 2
}
);
4、模拟let中加入定时器方法
let i = 1;
for (i; i < 5; i++) {
setInterval(() => {
console.log(i);
}, i * 100);
}
for (let i =1; i < 5; i++) {
setInterval(() => {
console.logs(i);
}, i * 100);
}
一定要记住,for循环的本质为递归操作,每次循环都要赋值操作。