• 5.5 function


    实例

    function sum(num1, num2){
    	return num1 + num2;
    }
    
    //函数表达式
    var sum = function(num1, num2){
    	return num1 + num2;
    }
    

    函数名是指向函数的指针,一个函数可能有多个名字

    function sum1(num1, num2){
    	return num1 + num2;
    }
    
    alert(sum1(1, 2));//3
    
    var anotherSum = sum1;
    l(anotherSum(10,10));//20
    sum1 = null;
    l(anotherSum(10,10));//20
    

    5.5.1 没有重载(深入理解)
    将函数名想象成指针

    function addSomeNumber(num){
    	return num + 100;
    }
    function addSomeNumber(num){
    	return num + 200;
    }
    addSomeNumber(100)//300
    
    
    var addSomeNumber  = function(num){
    	return num + 100;
    }
    
    addSomeNumber = function(num){
    	return num + 200;
    }
    addSomeNumber(100);//300
    创建第二个函数的时候,覆盖了引用第一个函数的变量addSomeNumber
    

    5.5.2 函数声明与函数表达式
    解析器解析的时候不是一视同仁:先读取函数声明,函数表达式要等解析器执行到它所在的代码行。

    alert(sum1(10, 10));//20
    function sum1(num1, num2){
    	return num1 + num2;
    }
    =====
    alert(sum1(10, 10));//sum1 is not a function
    var sum1 = function(num1,num2){
    	return num1 + num2;
    }
    
    

    5.5.3 作为值的函数

    function callSomeFunction(someFunction, someArgument){
    	return someFunction(someArgument);
    }
    
    function callSomeFunction(someFunction, someArgument){
    	return someFunction(someArgument);
    }
    function add10(num){
    	return num + 10;
    }
    
    var result = callSomeFunction(add10, 10);
    l(result);//20
    
    function getGreeting(name){
    	return 'hello ' + name;
    }
    var result2 = callSomeFunction(getGreeting, 'cjw');
    l(result2);//hello cjw
    
    function createComparisonFunction(propertyName){
    	return function(object1, object2){
    		var value1 = object1[propertyName];
    		var value2 = object2[propertyName];
    		if(value1 < value2){
    			return -1;
    		}else if (value1 > value2){
    			return 1;
    		}else{
    			return 0;
    		}
    	}
    }
    
    var data = [{name:'Zachary',age:228},{name:'Nicholas',age:29}];
    data.sort(createComparisonFunction('name'));
    l(data[0]);
    data.sort(createComparisonFunction('age'));
    l(data[0]);
    

    5.5.4 函数内部属性 arguments,this
    arguments: 一个类数组对象包含传入函数的所有参数
    arguments.callee: 指向拥有这个arguments对象的函数
    this: 引用的是函数据以执行的环境对象
    caller: 这个属性中保存着调用当前函数的函数的引用。

    function factorial(num){
    	if(num <= 1){
    		return 1;
    	}else{
    		return num * factorial(num-1);
    	}
    }
    
    l(factorial(5));
    //不受函数名限制
    function factorial(num){
    	if(num <= 1){
    		return 1;
    	}else{
    		return num * arguments.callee(num - 1);
    	}
    }
    

    this

    window.color = 'red';
    var o = {color:'blue'};
    function sayColor(){
    	l(this.color)
    }
    sayColor();//red
    
    o.sayColor = sayColor;
    o.sayColor();//blue
    

    caller

    function outer(){
    	inner();
    }
    
    function inner(){
    	l(inner.caller);//ƒ outer(){inner();}
    }
    
    outer();
    
    function outer(){
    	inner();
    }
    
    function inner(){
    	l(arguments.callee.caller);
    }
    outer();
    

    5.5.5 函数属性和方法(length,prototype, call,apply,bind)
    length: 希望接受的命名参数的个数
    prototype:保存所有实例方法的真正所在
    call,apply: 扩充函数赖以运行的作用域
    apply: 运行函数的作用域,接收数组
    call:运行函数的作用域,接收参数
    length

    function sayName(name){
    	l(name);
    }
    function sum1(num1, num2){
    	return num1 + num2;
    }
    function sayHi(){
    	l('hi');
    }
    l(sayName.length);//1
    l(sum1.length);//2
    l(sayHi.length);//0
    

    apply,call

    function sum1(num1, num2){
    	return num1 + num2;
    }
    function callSum1(num1, num2){
    	return sum1.apply(this, arguments);
    }
    function callSum2(num1, num2){
    	return sum1.apply(this, [num1,num2]);
    }
    function callSum3(num1, num2){
    	return sum1.call(this, num1, num2);
    }
    l(callSum1(10, 10));//20
    l(callSum2(10, 10));//20
    l(callSum3(10, 10));//20
    

    扩充函数赖以生存的作用域

    window.color = 'red';
    var o = {color: 'blue'};
    function sayColor(){
    	l(this.color);
    }
    sayColor();
    
    sayColor.call(this);//red
    sayColor.call(window);//red
    sayColor.call(o);//blue
    

    bind:创建一个函数的实例,其this值会被绑定到传给bind()函数的值

    window.color = "red";
    
    var o = {color:"blue"};
    function sayColor(){
    	l(this.color);
    }
    var objSayColor = sayColor.bind(o);
    objSayColor();//blue
    
  • 相关阅读:
    魔方
    js烟花特效
    面试cookie
    扩展日期插件
    通过javascript实现1~100内能同时被2和3整除的数并生成如下表格
    用三或四个个div标签实现工字效果
    2015_WEB页面前端工程师_远程测题_东方蜘蛛_1
    js公有、私有、静态属性和方法的区别
    Docker libnetwork(CNM)设计简介
    kubernetes,Docker网络相关资料链接
  • 原文地址:https://www.cnblogs.com/caijw/p/8150938.html
Copyright © 2020-2023  润新知