js 函数调用总结

在函数中this.a和var a是完全不同的东西,其中this指的是当前的对象

function f1(){
this.a = [10]
var a = 10
console.log(this.a) //[10]。这里指的是对象(函数)f1的a
console.log(a) //10
}
而且例如:
function Stack() {
// 栈中的属性
this.items = []

// 栈的相关操作
// 将元素压入栈
Stack.prototype.push = function(element) {
this.items.push(element)
}
这里的this.items指的是一样的东西
函数嵌套:
function myFun()
{
  var a = 1
function mySum(x,y)
{
var z=x+y;
return z;
}
var b=mySum(1,6);
myWrite(b);

}
myFun();
这种叫函数嵌套,在myFun函数中嵌套了一个mySum函数,其中嵌套定义的函数只能在被嵌套的函数中使用,如mySum函数只能在myFun函数的函数体中使用,而不能在myFun函数的其他顶层全局代码中调用,如myFun.mySum(),这样是错误的。
还有一点,console.log(myFun.a)也是错误的使用方法,因为函数执行完毕a会被销毁,所以会输出undefined
如果想要在外面使用,应该使用原型:
function f2() {
let a = 10
f2.prototype.m2 = function() { //这里把m2方法写到f2函数的原型中
a = 100
console.log(a)
}
}
var f = new f2() //先实例化,
f.m2() //实例化的对象f就可以调用原型的m2方法,这也说明了实例对象会去原型中找变量和方法

但是如果不实例化,而是写成f2.m2()这样来调用m2方法,是错误的,这也说明构造函数是无法直接去原型中查找变量和函数的。而且可以多试一下,f2.prototype.m2()这样也是错误的,无法访问到。

上面是最好的方法,但是,下面这种也可以:
以构造函数的形式调用时,this就是新创建的对象
function InitTest() {
this.atwo='initTest的变量two'; //这里this也是InitTest的变量
this.aThree='initTest的变量three';
this.afour=function(){
console.log(this) //这里this和下面是一样的,都是指向InitTest
}
console.log(this) //这里this和上面是一样的
}
var InitTest= new InitTest() //this->InitTest
InitTest.afour()//this->InitTest
console.log(this)//this->Windows
一定要实例化,如果不实例化,而是使用InitTest.afour()来调用,仍然会报错。


以函数的形式调用时,this是window
var aOne = '我是Windows对象的一个变量'
function initTest() {
var aTwo = 'initTest的变量two';
var aThree = 'initTest的变量three';
console.log(this); //这是一个特例,这里的this指的是window
}
console.log(this)
initTest();


以方法的形式调用时,this就是调用方法的对象
var aOne = '我是Windows对象的一个变量'
var InitTest = {
atwo: 'initTest的变量two',
athree: 'initTest的变量three',
afour: function () {
console.log(this)//这里就是指向 InitTest 方法
}
}
console.log(this)//这里还是 Windows
InitTest.afour()


就是说,要么函数里不写函数,就可以直接用函数名加括号直接调用;如果是嵌套函数,就只能在被嵌套的函数内部使用;要不就是用原型或this.函数名 = function(){}来在函数内定义函数,从而在函数外使用,但是这样使用的前提是一定要实例化。

一定要分清函数和对象,上面是函数,
这是对象,有冒号:
var InitTest = {
atwo: 'initTest的变量two',
athree: 'initTest的变量three',
afour: function () {
console.log(this)//这里就是指向 InitTest 方法
}
}

 

posted @ 2020-04-07 23:05  ajjoker  阅读(110)  评论(0)    收藏  举报