您的位置:首页 > Web前端 > JavaScript

js系列-2 js函数相关

2016-02-26 14:50 447 查看
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~8:false  
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());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: