hanyuxinting / Blog

记录点滴
1 stars 0 forks source link

JS权威指南-函数 #11

Open hanyuxinting opened 7 years ago

hanyuxinting commented 7 years ago

Get

1. bind 方法,函数绑定在对象上,但并不影响对象,对象还是之前的对象。该方法会返回一个新函数,新函数会把函数当做对象的函数执行。

bind 和 call、apply的区别是,基本都是把this交接给传入的对象,call apply是立即执行,而bind是稍后调用执行。

call 和 apply的区别:

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2])
function f(y){
    return this.x + y;
}

var o = {x:1};
var g = f.bind(o);
g(2); //3
function f(y){
    return this.x + y;
}

var o = {x:1}; 
f(3) //NaN

o.f // undefined
o //没有变化

理解闭包。

Function.prototype.bind = function(o){
    var self = this;
    var boundArgs = arguments;

    console.log(arguments.length) //2

    return function(){
        var args = [], i;
        for(i =1; i<boundArgs.length; i++){
            args.push(boundArgs[i]);
        }

        console.log(arguments == boundArgs)//false

        console.log(arguments.length)//1

        for(i=0;i<arguments.length; i++){
            args.push(arguments[i]);
        }

        return self.apply(o, args);
    }
}

var sum = function(x, y){
    return x+y;
}
var succ = sum.bind(null, 1);

succ(3);//4

2. toString()

succ.toString()

/*
"function (){
        var args = [], i;
        for(i =1; i<boundArgs.length; i++){
            args.push(boundArgs[i]);
        }

        console.log(arguments == boundArgs)

        console.log(arguments.length)

        for(i=0;i<arguments.length; i++){
            args.push(arguments[i]);
        }

        return self.apply(o, args);
    }"

*/

3. Function 构造函数-很少用呀!!!

Function('x','y')
结果:
function anonymous(x
/*``*/) {
y
}
var scope = 'global';
function testFunction(){
    var scope = 'local';
    return new Function('return scope');
}

testFunction()(); // global

4. 可调用的对象-一个非函数的可以被调用的对象。。

function isFunction(x){
    return Object.prototype.toString.call(x) === '[object Function]'
}

判断对象类型的方法

Object.prototype.toString.call(obj)

5. 函数式编程-操作函数

map() 方法创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数。 reduce() 方法对累加器和数组的每个值 (从左到右)应用一个函数,以将其减少为单个值。 every() 方法测试数组的所有元素是否都通过了指定函数的测试。

var sum = function(x, y){
    return x+y;
}

var square = function(x){
    return x*x;
}

var data = [1,1,2,3,4,5,6];
var mean = data.reduce(sum);
console.log(mean);
mean = mean/data.length;
console.log(mean);

var deviations = data.map(function(x){
    return x-mean;
});

var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));

6. push和contact的区别

push 改变原数组,contac建立一个新数组,对原有数组并不改变。

var array1 = [1,2,3]; 
var array2 = [4,5,6]; 
Array.prototype.push.apply(array1, array2); 

7. max获取数组最大值

var  numbers = [5, 458 , 120 , -215 ]; 
var maxInNumbers = Math.max.apply(null, numbers);
Math.max(...[1,2,3]);