js系列-2 js函数相关

1,函数包含一组语句,用于指定对象的行为,函数也是对象,也称函数对象。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)

每个函数都有一个prototype属性,它是一个对象,一个拥有constructor属性且值为该函数本身的一个对象。和对象的原型链不是一回事。

但是这个prototype将来会被多个该function的实例所继承(或者说该对象处于多个实例的原型链上);__proto__才是真正的原型链的实际指针,然而许多浏览器并不对外公开这个属性

function Foo(){};
var f1 = new Foo();
f1.__proto__===Foo.prototype    //true
Foo.__proto__===Function.prototype   //true
Function.prototype.__proto__===Object.prototype    //true
Object.__proto__===Function.prototype    //true
Object.prototype.__proto__          //null

2,函数创建包括函数字面量(包括函数声明与函数表达式)与new  Function()(函数构造器)两种方式。

var a = 9;
(function(){
var b = 0;
Function('console.log("----"+a);console.log("----"+b);')();
})();            ----9  UncaughtReferenceError: b is not defined

一般的函数声明与表达式能访问到外函数的变量,但Function拿不到,这就是Function少使用的一个原因。

函数声明,函数表达式(立即执行函数表达式,匿名函数表达式,命名函数表达式),

(function(){
   foo(); //在声明之前就进行了调用
   function foo(){console.log("Hello"); }
})();               -------Hello
 
 (function(){
   foo();
   var foo = function(){console.log("Hello"); }       --匿名函数表达式
})();              Uncaught TypeError:undefined is not a function

看程序写结果:

myname ="global"; // 全局变量
function func() {
    alert(myname);
    var myname ="local";
    alert(myname);
}
func();

函数声明会前置!变量声明也会前置。但变量前置声明为undefined

命名函数表达式。(应用于调试时调用栈) ----- 不常用

var foo=function  too(){}

foo===too  

IE6~8false   chrome/IE9 too is undefined


三种函数创建方式的比较:


函数声明 函数表达式 函数构造器
前置 会前置 不会前置 不会前置
允许匿名 不允许 允许 没有函数名
立即调用 不可以 可以 可以
在定义该函数的作用域通过函数名访问 可以

3, 一般无return 的话返回undefiend,如果作为构造器,无return或返回基本类型,则返回this

 

4, 函数的调用与this

A,方法调用模式:myObject.foo();

       ----this指向调用者对象上,

B,函数调用模式:foo();

      ----this指的全局对象

C,构造器调用模式

        ----使用new来调用构造器,将创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到这个新对象上

D,Apply/call 调用

----this会作为第一个参数传入,如果传入null/undefined,方法中的this会指向全局对象,而在严格模式下,this就指向null/undefined

  了解ES5提供的bind方法:

 functionf(){
  returnthis.a;
  }
  Var g = f.bind({a:”hello”});

 Console.log(g());


你可能感兴趣的:(js,函数相关)