function test(){
alert(thislength);
}
则,如下调用:
var str = new String(“test”);
strtest = test;
strtest();
此时的this就是字符串str,则调用过程d出this的长度,实际就是d出这里的str的长度,所以结果是4
而如果是下面的调用:
var arr = new Array(1,2,3,4,5,6);
arrtest = test;
arrtest();
则这里的this就是arr这个数组,相应的d出的就是数组arr的长度,也就是6
而当没有对象来调用这个函数,即直接调用时,如下:
test();
因为在js中,全局的定义默认都是window的属性或对象,所以这里的调用,实际上是如下调用:
windowtest();
window的length为0则d出的就是0如果你定义了一个length,比如如下调用:
var length = 10;
test();
则d出的就是10了。因为全局的定义一个length,实际相当于给window添加或重写了一个属性length。
一个基本概念:普通函数的 this 指向不是在定义的时候确定,而是在调用的时候确定。
两个注意事项:
接下来从一般形式函数调用、方法调用、apply 和 call 调用、箭头函数、class 等理清指向问题。
所谓一般形式函数调用就是 函数名() ,this 指向全局对象。
一个函数被设置为对象(非全局对象)的属性值时,就是方法调用,this 指向对象自身。
箭头函数没有自己的 this,看其 定义时 外层是否有函数,如果有,外层函数的 this 就是内部箭头函数的 this,如果没有,则 this 指向 Window。
一般来说,在 vue 生命周期函数或自定义方法中 this 指向的是 vue 实例,但是要注意下面的3种情况。
以上理解如果有不对之处请指出。
this语句用于引用当前对象,并可以引用当前对象相应的属性。this语句的使用范围必须局限于函数范围内惑它的调用函数范围内。语法位:this[属性]如果未包括属性参数,则传递当前对象。但是为了得到一个结果,建议为语句附上有效的属性。
例如:
简写啊
<function
abc(name)
{
alert("欢迎"+name);
}
<input
type="t1"
name="t1"
size=20>
<input
type="button"
value="单击"
onclick="abc(thisformt1value)">
如果你在文本框内写上“123”
这样就会d出对话框
“欢迎123”。JavaScript 中的 this 一直是容易让人误用的,尤其对于熟悉 Java 的程序员来说,因为 JavaScript 中的 this 与 Java 中的 this 有很大不同。在一个 function 的执行过程中,如果变量的前面加上了 this 作为前缀的话,如thismyVal,对此变量的求值就从 this 所表示的对象开始。this 的值取决于 function 被调用的方式,一共有四种,具体如下:如果一个 function 是一个对象的属性,该 funtion 被调用的时候,this 的值是这个对象。如果 function 调用的表达式包含句点()或是 [],this 的值是句点()或是 [] 之前的对象。如myObjfunc和myObj["func"]中,func被调用时的 this 是myObj。如果一个 function 不是作为一个对象的属性,那么该 function 被调用的时候,this 的值是全局对象。当一个 function 中包含内部 function 的时候,如果不理解 this 的正确含义,很容易造成错误。这是由于内部 function 的 this 值与它外部的 function 的 this 值是不一样的。代码清单 5中,在myObj的func中有个内部名为inner的 function,在inner被调用的时候,this 的值是全局对象,因此找不到名为myVal的变量。这个时候通常的解决办法是将外部 function 的 this 值保存在一个变量中(此处为self),在内部 function 中使用它来查找变量。如果在一个 function 之前使用 new 的话,会创建一个新的对象,该 funtion 也会被调用,而 this 的值是新创建的那个对象。如function User(name) {thisname = name}; var user1 = new User("Alex");中,通过调用new User("Alex"),会创建一个新的对象,以user1来引用,User这个 function 也会被调用,会在user1这个对象中设置名为name的属性,其值是Alex。可以通过 function 的 apply 和 call 方法来指定它被调用的时候的 this 的值。 apply 和 call 的第一个参数都是要指定的 this 的值,两者不同的是调用的实际参数在 apply 中是以数组的形式作为第二个参数传入的,而 call 中除了第一个参数之外的其它参数都是调用的实际参数。如funcapply(anotherObj, [arg1, arg2])中,func调用时候的 this 指的是anotherObj,两个参数分别是arg1和arg2。同样的功能用 call 来写则是funccall(anotherObj, arg1, arg2)。这个问题问到js的精髓了。
在js中,万物皆对象,函数只是对象的一种。
js的this,指代着当前对象的自身(itself),但通过你的问题的内容,发现,你关注的地方并不单单在this关键词。
function a(value){
thisvalue =value;
alert(thisvlaue);
}
上面的这个函数语句,意味着,创建了名字为a,参数为value的函数对象:
这个函数对象有一个来自于参数的动态属性value;
这个函数对象还有一个返回值为void的window内置函数alert;
这个函数对象自身没有返回值(void)。
alert(new a(1)value);
上面的这个语句,意味着,新建一个参数为1的a对象,并把这个对象的value作为参数赋值给window的alert函数,并执行window的alert函数。
在上面的语句中,测试时,会出现两次警告框,且警告框的内容都是1,这是因为在新建a对象的时候,执行了一次alert,拿到a对象的value后,又执行了一次alert。
alert(windowa(3));
上面的这个语句,意味着,把3作为window对象的a函数的一个参数,执行a函数。
在上面的语句中,测试时,也会出现两次警告框,但是第一次是3,第二次就是undefined了,这是因为,windowa(3)执行的时候,会alert一下,内容就是3,alert()执行的时候,因为里面的windowa(3)没有返回值,所以alert的参数就是没有,所以就导致d出了一个“undefined”
function a(){
fucntion b(){}
return b;
}
new a()()
可以这么写(new a()())的原因是:
1、“new a()” ,这个是个对象创建过程,就是说,这样可以创建一个全新的函数对象。
2、第二个“()”,这个是个函数执行过程,就是说,加上一对“()”后,这个对象函数才开始执行。
a()b()
不可以这么写的原因是:
a()会让这个a函数对象执行后,返回的是一个名字为没有名字的空函数对象,这个空函数对象里面,并没有一个名字叫b的方法。
你如果想让上面的a里面的b函数顺利执行,可以参考下面的案例:
function a(){
function b(){alert(111)}
return b;
}
a()();//这样你就顺利的看到这个b函数执行了。
最后给你一个让你头晕的案例,呵呵。考虑一下是如何执行的,这个案例你完全搞明白后,基本上js的函数对象返回值问题,就不会再有了。
function a(){
thisb = function (){
return thisc = function(){
alert(111);
}
}
}
(new a()b())();this是指在哪个标签中调用即为哪个标签对象
例如:<div onclick="thisstylecolor='red'">red</div> 则是使当前div的内部文字为红色
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)