js如何判断函数或者方法中的js this指向向谁

下次自动登录
现在的位置:
& 综合 & 正文
html行内触发事件的this指向(原生js学习)
http://www.cnblogs.com/snandy/archive//1976317.html
var m=function(){
A:function(){
m:function(){
B:function(){
var m=function(){
var div=document.createElement("div");
div.innerHTML="&p onclick='m();'&xx&/p&";
document.body.appendChild(div);
看起来好像onclick=m()会调用B函数里头定义的m函数,其实不会。这里新增html,且是html行内触发事件,所以函数执行在全局,m()调的是全局定义的m函数,结果弹出2,和B函数作用域一点关系都没有。
潜在包含了一层匿名函数:
&p id="f" onclick="console.log(this)"&1&/p&,值为&p id="ff" onclick="console.log(this)"&1&/p&自己。
这里相当于:
(p#f).onclick=function(){
console.log(this);
所以this当然是调用事件的p#f
&p id="f" onclick="function A(){alert(this==window);};A();"&1&/p&
(p#f).onclick=function(){
function A(){alert(this==window);};
所以A里头的this当然是window。
&p id="f" class="x" onclick="A(this)"&1&/p&
var A=function(m){
alert(m.className);
//点击弹出"x"
这里相当于:
p#f.onclick=function(){
function体里的this必然是#f元素对象,所以可以弹出m.className。。
var m=function(){
alert(10);
B:function(){
var m=function(){
var div=document.createElement("div");
div.innerHTML="cutemurphy";
div.id="gg";
document.body.appendChild(div);
document.getElementById("gg").addEventListener("click",m,false);
这个结果恰好和行内执行事件的结果相反,这里会弹出1,而非10。因为它的m函数并非去全局找,而是按照普通的函数作用域链来查找。。。理论支持是函数执行在定义的作用域里。
A:function(){
console.log(this);
B:function(){
var m=function(){
var div=document.createElement("div");
div.innerHTML="&p id='xx'&xx&/p&";
document.body.appendChild(div);
var xNode=document.getElementById("xx");
xNode.addEventListener("click",this.A,false);
这里很有意思,addEventListener里的this.A的this指的是obj,而this.A的函数体function(){console.log(this)}里的this又是xNode。
【上篇】【下篇】在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
关于function中的this指向老觉得很迷惑。
document.body.onclick = function(){
console.log(this); // 这个this指向body
function click_inner(){
console.log(this); // 这个this指向了window
click_inner();
从上面的代码可以推测出:每个function中都有一个this。
我原先的理解为:click_inner 内没有this,但是其上层函数中有this,所以根据JS的作用域和作用域链的知识可知(内部没有的变量就上溯到上层环境查找,找到就返回),内部的this就是外部函数的变量对象中的this。
按照我原先的理解:那么click_inner内操作的this也应该指向body,但是结果显然说明我原先理解错了。。。
按照结果来说,click_inner内的this也是指向window的,但是为什么window.click_inner()就报错呢?好像又推翻了上面的推测。。
请大神详细的解答一下关于this的知识。。感激不尽!!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
javascript 的this主要是看如何调用这个函数,而不是这个函数所在的作用域。obj.fn() fn中的 this 就是 obj。 fn() this是undifine, 而在js进入函数之前,会有 if(!this) { this = window} 这样的操作。因此,后面那个this是window。
总结一下,this 一共有六种不同的值:
普通函数调用,this为全局对象或是undefined
作为对象的方法,this为那个对象
new 表达式,this为以该函数为原型的新创建的对象
使用 apply/call指定 this
用bind绑定固定的this
事件处理函数中的this是当前的触发事件的DOM元素(event.currentTarget)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你这个问题比较复杂,实际中很少出现
1,this跟代码中的位置没关系,是在执行的时候赋值的2,你是点击body,触发了body的onclick事件,onclick是body对象的方法,所以它的this是body3,你在onclick函数内部声明了一个click_inner函数,这时候这个函数的作用域是全局作用域也就是window,执行它也是在全局作用域里执行,因为你不是this.click_inner = function ... 执行的时候也不是this.click_inner(),没指定this,this就跑到全局了4,为什么直接window.click_inner 里你直接跑没有,因为click_inner是在onclick里声明的啊,你没执行onclick的时候window里是没有click_inner的
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
js的this比较诡异,谁执行就指向谁,很明显,click_inner没人调用,是window执行的。。。所以的就指向window
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
this说来话长,你看下这个吧:(笔记)原文在这:
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你在定义body的onclick时,可以理解成定义body对象的一个方法,此时引用的this就是body对象,而click_inner则并不是定义成body的方法的,所以直接引用this。
另外,正如你所说的,如果当前域找不到变量,程序会向上查找,但这并不代表方法本身也能向上依靠。click_inner只是向上查找到this为window,但并不表示window向下就可以查到click_inner这个方法,所以你直接调用window.click_inner()并不一定是正确的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1) this是不会沿着变量作用域、原型链或闭包结构向上查找的2) this只存在于函数调用期间,在变量作用域中不存在
函数中this的指向有以下几种:1)当函数作为一个对象的方法调用时,this指向这个对象2)当函数作为普通函数调用时,this指向全局对象window(浏览器环境下)或global(nodejs环境下)3)当函数作为构造函数并通过new操作符时,this指向新创建的对象4)可以通过Function的apply和call方法强制调整this的指向
document.body.onclick = function(){
console.log(this); // 这个this指向body
function click_inner(){
console.log(this); // 这个this指向了window
click_inner();
onClick回调函数作为document.body的一个方法调用,所以其this指向bodyclick_inner为回调函数中定义的的一个内部函数,其作用域在onclick的回调函数内click_inner();作为普通函数调用,其运行期的this指向windowwindow.click_inner()报错是因为click_inner函数在window对象下不存在...
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var outer = new Object();
outer.func = function() {
console.log(this);
function inner() {
console.log(this);
outer.func();
func()是作为outer对象的方法调用的,它的this就是outer。—— 函数作为谁的方法被调用,其this就是该方法。
inner()作为函数被调用,它的this就是window。只不过inner如果在函数内部声明,只有在函数内部才能访问到inner。把函数名和函数功能分割开来 —— 函数功能的执行环境即this的值是全局,函数名只能在函数内部被访问到。
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。Access denied | www.ruanyifeng.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.ruanyifeng.com) has banned your access based on your browser's signature (43284cdf54d3779c-ua98).javascript关于自执行函数的this指向问题_百度知道
javascript关于自执行函数的this指向问题
var item = 10;
var game = (function() {
var item = 5;
var get = function() {
return this.
var test = function() {
var finalResult = get();
alert(finalResult);
test: test
game.test();/...
我有更好的答案
&!DOCTYPE&HTML&&html&&head&&title&yugi&/title&&meta&charset=UTF-8&/&&style&type=&text/css&&&/style&&script&type=&text/javascript&&src=&jquery-1.8.0.min.js&&&/script&&script&type=&text/javascript&&var&item&=&10;var&game&=&(function()&{&&&&var&item&=&5;&&&&&&&&var&get&=&function()&{&&&& //&这个this取决于哪个对象调用这个get方法。&&&&&&&&return&this.&&&&}&&&&&&&&var&test&=&function()&{&&&& //&这个get方法是被window调用的,属于全局的item&&&& //&等价于&window.get()&&&&&&&&var&finalResult&=&get();&&&&&&&&console.debug&(finalResult);&&&&}&&&&return&{&&&&&&&&get:&get,&&&&&&&&test:&test&&&&}})();console.error&(game);//&通过调用test方法,但是test方法里面并没有声明this,故而为window,就是全局的调用,所以就是那个外面的itemgame.test();&//&10&//&game对象调用get方法,this就是game,但是返回的是&{get:get,test:test},并没有所谓的item,故而为undefinedgame.get();//----------------------------------var&item&=&10;var&game&=&(function()&{&&&&var&item&=&5;&&&&var&get&=&function()&{&&&& //&哪个调用get方法,this就是哪个&&&&&&&&console.log&(this.item);&&&& //&全局的item&&&&&&&&console.log&(window.item);&&&&&&&&//&默认局部变量&&&&&&&&console.log&(item);&&&&}&&&&return&{&&&&&&&&get:&get&&&&}})()console.warn&(game);//&同理,game就是{get:get},没有所谓的item,但是get方法里面是this调用,所以就是undefinedgame.get();&//&结果为undefined//&回答完毕,费心劳力,采纳即可。。。。。。。。!!!!!!!~~~~Void@@#####$$$$%%^&**(())&/script&&/head&&body&&/body&&/html&
采纳率:71%
为您推荐:
其他类似问题
javascript的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。js如何判断函数或者方法中的this指向谁?四句话
1.谁作为拥有者调用它就指向谁
function a() {
console.log(this);
//这时候this指向b//常见的就是绑定事件
2.bind谁就指向谁
function a() {
console.log(this);
var c = {};
b.hehe = a.bind(c);
//这时候this指向c//如果你用bind的话
3.没有拥有者,直接调用,就指向window
function a() {
console.log(this);
//this指向window
4.call谁就是谁,apply谁就是谁,其实bind就是通过call和apply实现的
其中2覆盖掉1
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 js this指向 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信