如果您想了解Javascript’this’值改变了,但无法弄清楚原因的相关知识,那么本文是一篇不可错过的文章,我们将对js中改变this的方法进行全面详尽的解释,并且为您提供关于android–对N
如果您想了解Javascript’this’值改变了,但无法弄清楚原因的相关知识,那么本文是一篇不可错过的文章,我们将对js中改变this的方法进行全面详尽的解释,并且为您提供关于android – 对Nativescript插件中的Java对象无效’this’、android – 强制关闭onClick的ImageButton,无法弄清楚原因、JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题_javascript技巧、javascript – Angular2’this’未定义的有价值的信息。
本文目录一览:- Javascript’this’值改变了,但无法弄清楚原因(js中改变this的方法)
- android – 对Nativescript插件中的Java对象无效’this’
- android – 强制关闭onClick的ImageButton,无法弄清楚原因
- JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题_javascript技巧
- javascript – Angular2’this’未定义
Javascript’this’值改变了,但无法弄清楚原因(js中改变this的方法)
var generator = { generateForLevelSkillAndCount : function(level,skill,count) { var functionCall = this['generate_' + level + '_' + skill]; return functionCall(count); },generate_0_4 : function(count) { return this.generate_generic_dots(count,3); },generate_generic_dots : function(count,maxDots) { /* do cool stuff and return it */ } };
所以,我调用generator.generateForLevelSkillAndCount(0,4,20)并且它正常工作,调用generate_0_4(count).然而,这是失败的地方,Chrome的Javascript控制台告诉我“未捕获的TypeError:对象[对象DOMWindow]没有方法’generate_generic_dots’.”
我知道问题就是问题是generate_0_4中的这个值是一个DOMWindow对象,而不是生成器(这是在generateForSkillLevelAndCount中指向的,但我无法弄清楚为什么会发生这种情况.
更新:我根据CMS的建议更新了示例代码以摆脱eval,但是返回了相同的错误,因此它不仅仅是一个eval错误.
解决方法
var foo = { bar: function() { alert(this.baz); },baz: 5 }; var bar = foo.bar; var baz = 3; foo.bar(); // alerts 5,from foo foo["bar"](); // alerts 5,from foo bar(); // alerts 3,from the global object
请注意,所有三个函数调用都是完全相同的函数!
因此,在您的代码中,您将所需的方法分配给functionCall并直接调用它,这会导致该函数使用window作为其上下文对象.有两种方法:访问方法作为对象属性或使用.call()
或.apply()
:
function generateForLevelSkillAndCount1(level,count) { return this['generate_' + level + '_' + skill](count); } function generateForLevelSkillAndCount2(level,count) { var functionCall = this['generate_' + level + '_' + skill]; return functionCall.call(this,count); }
android – 对Nativescript插件中的Java对象无效’this’
所以我在我的插件中添加了以下功能:
MobileServiceUser.newUser = function (userId,client) { var userObject = com.microsoft.windowsazure.mobileservices.authentication.MobileServiceUser(userId); // causing the error client.setCurrentUser(userObject); };
UserId是一个字符串.
然而,顶线抛出了error:
JS: Error: Trying to link invalid ‘this’ to a Java object
我有一个完整的回购,显示了在Github创建此问题的最小启示.
我真的很感激任何建议如何解决这个问题.
解决方法
错误有点简单,但如果你看一下代码源,你会发现它实际上告诉你,你不能将一个变量链接到Object / Class本身作为参考:
MobileServiceUser.newUser = function (userId,client) { var userObject = com.microsoft.windowsazure.mobileservices.authentication.MobileServiceUser(userId); };
如果要实例化类,则需要使用关键字new来表示此操作.如果在类构造函数调用之前没有新列出,程序只会看到您在userObject和类本身之间建立了直接链接.这应该可以解决您的问题:
var userObject = new com.microsoft.windowsazure.mobileservices.authentication.MobileServiceUser(userId);
干杯〜Px的
android – 强制关闭onClick的ImageButton,无法弄清楚原因
main.xml中
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal"> <ImageButton android:id="@+id/plus1" android:layout_width="75dp" android:layout_height="75dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="@null" android:src="@drawable/plus" android:visibility="visible" android:gravity="center_horizontal" android:onClick="RunAnimations" /> <ImageButton android:id="@+id/gears1" android:layout_width="75dp" android:layout_height="75dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="@null" android:gravity="center_horizontal" android:src="@drawable/gears" android:textSize="42sp" /> </LinearLayout>
translate.xml
<?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromYDelta="-100%" android:toYDelta="0%" android:duration="1000" android:zAdjustment="top" > </translate> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000"> </alpha> </set>
主要活动:
public class AnimationtestActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } private void RunAnimations() { Animation a = AnimationUtils.loadAnimation(this,R.anim.translate); View ib = findViewById(R.id.gears1); ib.clearanimation(); ib.startAnimation(a); } }
编辑:
我修好了
private void RunAnimations(查看视图)
但它仍然强行关闭
编辑2:logcat的内容
03-08 13:07:33.968: E/AndroidRuntime(29270): FATAL EXCEPTION: main 03-08 13:07:33.968: E/AndroidRuntime(29270): java.lang.IllegalStateException: Could not find a method RunAnimations(View) in the activity class com.test.AnimationtestActivity for onClick handler on view class android.widget.ImageButton with id ''plus1'' 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.view.View$1.onClick(View.java:3026) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.view.View.performClick(View.java:3480) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.view.View$PerformClick.run(View.java:13983) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.os.Handler.handleCallback(Handler.java:605) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.os.Handler.dispatchMessage(Handler.java:92) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.os.Looper.loop(Looper.java:137) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.app.ActivityThread.main(ActivityThread.java:4340) 03-08 13:07:33.968: E/AndroidRuntime(29270): at java.lang.reflect.Method.invokeNative(Native Method) 03-08 13:07:33.968: E/AndroidRuntime(29270): at java.lang.reflect.Method.invoke(Method.java:511) 03-08 13:07:33.968: E/AndroidRuntime(29270): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 03-08 13:07:33.968: E/AndroidRuntime(29270): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 03-08 13:07:33.968: E/AndroidRuntime(29270): at dalvik.system.NativeStart.main(Native Method) 03-08 13:07:33.968: E/AndroidRuntime(29270): Caused by: java.lang.NoSuchMethodException: RunAnimations [class android.view.View] 03-08 13:07:33.968: E/AndroidRuntime(29270): at java.lang.class.getConstructorOrMethod(Class.java:460) 03-08 13:07:33.968: E/AndroidRuntime(29270): at java.lang.class.getmethod(Class.java:915) 03-08 13:07:33.968: E/AndroidRuntime(29270): at android.view.View$1.onClick(View.java:3019) 03-08 13:07:33.968: E/AndroidRuntime(29270): ... 11 more
解决方法
public void RunAnimations(View view) { . . . }
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题_javascript技巧
先来看看现象:
当单击DIV后,弹出框显示undefined。
原因是当DOM对象响应单击事件后,事件方法中的this关键字指向的是DOM对象,此时DOM对象没有a属性,所以弹出undefined。
而程序员本意是响应事件方法中this指向的是classA的对象a,如何才能达到此目的?这就需要使用到call或apply方法。
下面再来熟悉下call方法:
摘要:
function.call(thisobj, args…)
参数:
thisobj
调用function的对象。在函数主体中,thisobj是关键字this的值。
args…
任意多个参数,这些参数将传递给函数function。
返回值:
调用函数function的返回值。
抛出:
TypeError
如果调用该函数的对象不是函数,则抛出该异常。
描述:
call()将指定的函数function作为对象thisobj的方法来调用,把参数列表中thisobj后的参数传递给它,返回值是调用函数后的返回值。在函数体内,关键字this引用thisobj对象。
如果将指定数组作为传递给函数的参数,请使用Function.apply()方法。
熟悉call()方法后,将代码1修改如下:
代码2: