vue源码学习之旅-day2

  1. 让函数只执行一次的闭包函数 once
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function once(f){
var called = false
return function (){
if(!called){
called = true
f.apply(this,arguments)
}
}
}

// 使用示例
var handler = once(function (){
console.log("hello")
})

handler() // hello
handler() // 无效
handler() // 无效
  1. Object.defineProperty() 的封装函数 def。 源码中经常用到,有个印象即可
1
2
3
4
5
6
7
8
function def(obj,key,val,enum){
Object.defineProperty(obj,key,{
value:val,
enumerable:Boolean(enum),// 能否被for...in 和 Object.keys() 枚举?
writable:true,// 可改写不?
configurable:true // 属性能否被删除?除writeable外的配置属性能改不?
})
}
  1. 是否原生支持的方法
1
2
3
4
5
6
function isNative(f){
return typeof f === 'function' && (/native code/.test(f.toString()))
}
// 示例
Math.max // ƒ max() { [native code] }
isNative(Math.max) // true
  1. 使用位运算实现字符串的重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function repeat(str, n) {
var res = '';
while (n) {
if (n % 2 === 1) {
res += str;
}
if (n > 1) {
str += str;
}
// 相当于 Math.floor(n/2),这里用了移位运算。实用性不大,红宝书有相关说明
n >>= 1;
}
return res
}
// 示例
repeat("abc",3) // "abcabcabc"