GVKun编程网logo

Javascript’this’值改变了,但无法弄清楚原因(js中改变this的方法)

15

如果您想了解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的方法)

Javascript’this’值改变了,但无法弄清楚原因(js中改变this的方法)

我是一个完整的 Javascript newb,我正试图围绕OLN.我遇到的是,当从同一个对象上的另一个方法调用一个对象方法时,被调用方法中’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错误.

解决方法

在JavaScript中,上下文对象(this)设置为“全局对象”(窗口,在浏览器中),除非该方法作为对象属性进行访问.因此:

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’

android – 对Nativescript插件中的Java对象无效’this’

我正在尝试开发一个nativescript插件,以使用Azure SDK执行某些功能. SDK的 docs显示如下:

enter image description here

所以我在我的插件中添加了以下功能:

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,无法弄清楚原因

android – 强制关闭onClick的ImageButton,无法弄清楚原因

我正在尝试用 ImageButtons做一个简单的动画,当我设置它时,如果我只是触摸屏幕,它工作得很好,但如果我尝试在onClick上做,应用程序就会关闭.

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技巧

JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题_javascript技巧

先来看看现象:

复制代码 代码如下:



apply_and_call







当单击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:
复制代码 代码如下:



apply_and_call







代码2 25行:主要添加了createDele方法,该方法包含三个参数:fun、obj、arg,分别是“要执行的方法”、“fun中this需要指向的对象”、“传入fun中的参数”。该方法返回一个匿名方法。
匿名方法负责执行fun方法,同时将fun中的this指向obj,并使用作为arg传入参数,处理结果返回。
当程序执行走到第15行调用createDele方法,传入对象的方法和对象本身,createDele接收参数后返回一个匿名方法,this.clickDele被设置成为返回的匿名方法,16行代码将this.clickDele(匿名方法)绑定到DOM事件上,程序执行完毕,点击DOM(DIV)触发匿名方法,些时匿名方法中fun为之前传入的this.click(即:方法a.click),obj为之前传入的this(即:对象a),所以此时使用call方法使得this.click(即:方法a.click)中的this指向obj(即:对象a),最终弹出结果为1。结果正确,达到了程序的本意。
回顾匿名方法多少会让人感到有些怪异:调用匿名方法时fun为什么会是this.click(即:方法a.click)、obj什么为是this(即:对象a)。这个问题就需要用JavaScript的闭包来解释了,这里暂不介绍闭包,后面会有介绍JavaScript闭包的文章发表,欢迎有兴趣的朋友持续关注!
不管各位看官信还是不信,反正道理和程序是没有问题的!:)

javascript – Angular2’this’未定义

javascript – Angular2’this’未定义

我有一个代码如下:
export class CRListComponent extends ListComponent<CR> implements OnInit {

    constructor(
        private router: Router,private crService: CRService) {
        super();
    }

    ngOnInit():any {
        this.getCount(new Object(),this.crService.getCount);
    }

ListComponent代码是这样的

@Component({})
export abstract class ListComponent<T extends Listable> {

    protected getCount(event: any,countFunction: Function){
        let filters = this.parseFilters(event.filters);
        countFunction(filters)
            .subscribe(
                count => {
                    this.totalItems = count;
                },error => console.log(error)
            );
    }

CRService的相应服务代码片段是这样的:

getCount(filters) {
    var queryParams = JSON.stringify(
        {
            c : 'true',q : filters
        }
    );

    return this.createquery(queryParams)
        .map(res => res.json())
        .catch(this.handleError);
}

现在当我的ngOnInit()运行时,我收到一个错误:

angular2.dev.js:23925 EXCEPTION: TypeError: Cannot read property
‘createquery’ of undefined in [null]

ORIGINAL EXCEPTION:
TypeError: Cannot read property ‘createquery’ of undefined

所以基本上,返回this.createquery(queryParams)语句中的this将为null.有人知道这有可能吗?

解决方法

问题出在这里:
gOnInit():any {
    this.getCount(new Object(),this.crService.getCount); // <----
}

由于您引用了对象外部的函数.你可以在它上面使用bind方法:

this.getCount(new Object(),this.crService.getCount.bind(this.crService));

或将其包装成箭头功能:

this.getCount(new Object(),(filters) => {
  return this.crService.getCount(filters));
});

第二种方法是首选方法,因为它允许保留类型.有关详细信息,请参阅此页面:

> https://basarat.gitbooks.io/typescript/content/docs/tips/bind.html

我们今天的关于Javascript’this’值改变了,但无法弄清楚原因js中改变this的方法的分享就到这里,谢谢您的阅读,如果想了解更多关于android – 对Nativescript插件中的Java对象无效’this’、android – 强制关闭onClick的ImageButton,无法弄清楚原因、JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题_javascript技巧、javascript – Angular2’this’未定义的相关信息,可以在本站进行搜索。

本文标签:

上一篇javascript – 将数组附加到无序列表(js数组添加元素到数组尾部)

下一篇如何使用javascript将Hello拆分为Hello(js文件拆分)