浅谈对this的理解

本文详细解析了JavaScript中this关键字的使用场景与指向规则,包括默认指向window、事件处理函数中的指向、定时器函数中的指向变化、new操作符创建实例时的指向以及call和apply方法对this指向的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"this" 是个关键词,是个存放指针的变量。

前提是在js中,别的语言我更不清楚了:

1、 this 默认指向 是   window

       e.g  

var name ='mongo';
console.log(this.name)       //  mongo
console.log(this)           // window

2、如果给元素添加了事件,当元素调用事件函数的时候, this 指向了 该 元素

       e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
      console.log(this)      //  oBtn 这个对象元素
}

3、如果给元素添加了事件,而该事件函数里面又套了一层函数, 此时该元素调用 事件函数的时候, this 指向又发生了 变化, 指向了全局 window

      e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
       setTimeout(function(){
               console.log(this) // window
        },1000)
}
       如果不包一层setTimeout,还可以加 return

       e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
       return function(){
                console.log(this)   // window
        }
}


4、当遇到new 的时候, this 指向 了一个新的实例对象

       e.g

   

function Person(name){
      this.name = name;
      this.sayName = function(){
              console.log(this.name)
              console.log(this)
       }
}

var onePerson = new Person('mongo')
onePerson.sayName();    // ‘mongo’  onePerson实例对象
5、即便new 很厉害,但是遇到 call 或者apply 也认怂了! 此时的 this  会指向  call或者apply 里面的第一个参数对象!

       e.g

var name = ‘mongo’;

function Person(name){
       this.name = name;
       this.sayName = function(){
               console.log(this.name)
               console.log(this)
        }
}

var onePerson = new Person('liulian');
onePerson.sayName().call('window')   // mongo  此时的this就指向了 全局window

稍稍总结一下, this 是一个存指针的变量, this指向一直在变化, 为什么会变化,应该是随着上下文执行的环境变化而变化吧!  情况大概分为四种:

1、 谁调用了此函数, 那么this 就指向谁

2、如果遇到函数里面又包了一层函数,那么 this的指向就变成全局的了

3、 如果遇到new  那么指向就是 新创建的实例对象

4、如果遇到call 或apply,那么 this 指向就是 call或apply 里面的第一个参数

<think>好的,我现在需要帮助用户了解如何使用Android DataBinding。根据用户提供的引用内容,我需要整理一个结构清晰的教程。首先,我要确定DataBinding的基本配置步骤,因为这是开始使用的前提。然后,布局文件的修改是关键,需要解释如何将传统布局转换为DataBinding支持的格式。接下来,数据绑定的部分,用户可能需要知道如何创建数据模型并将其与UI绑定,引用中的User类示例和BindingAdapter的使用都是重点。此外,用户可能对在Activity和Fragment中的不同用法感兴趣,比如在Activity中使用DataBindingUtil.setContentView,而在Fragment中使用inflate方法。我还需要提到数据绑定的优势,比如减少样板代码,以及处理复杂数据的方法,比如使用@BindingAdapter自定义属性。最后,生成相关问题可以帮助用户深入理解,比如性能优化或与LiveData的结合。需要确保所有步骤都符合引用内容,并且语法正确,使用中文回答,行内公式用$...$,独立公式用$$...$$,不过在这个问题中可能公式较少,但要注意LaTeX的正确使用。检查是否有遗漏的步骤,例如启用DataBinding的Gradle配置,绑定变量的设置,以及事件处理的方法。确保每个部分都有对应的引用标注,比如在Activity和Fragment中的用法分别引用[^2]和[^1]。最后,生成的相关问题要覆盖用户可能感兴趣的扩展方向,如性能、优化、应用场景等。</think>### Android DataBinding 使用教程 #### 1. **启用DataBinding** 在模块的$build.gradle$文件中添加配置: ```groovy android { ... dataBinding { enabled = true } } ``` 同步项目后,系统会自动生成与布局文件对应的绑定类。 #### 2. **修改布局文件** 将传统XML转换为DataBinding格式: ```xml <!-- activity_main.xml --> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.example.User" /> </data> <LinearLayout...> <TextView android:text="@{user.name}" // 直接绑定变量 .../> <ImageView app:imageUrl="@{user.avatarUrl}" // 自定义属性绑定 .../> </LinearLayout> </layout> ``` 布局根标签需改为$<layout>$,并通过$<data>$定义变量[^3]。 #### 3. **数据绑定实现** - **数据模型类**(例如$User$)需使用可观察机制(如$BaseObservable$或$LiveData$): ```java public class User extends BaseObservable { private String name; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name); // 触发UI更新 } } ``` - **在Activity中绑定数据**: ```java ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); User user = new User(); user.setName("John Doe"); binding.setUser(user); // 关键绑定语句 ``` - **在Fragment/Adapter中使用**: ```java ListItemBinding binding = DataBindingUtil.inflate( LayoutInflater.from(context), R.layout.list_item, parent, false ); binding.setVariable(BR.item, dataItem); // BR.item对应布局中定义的变量名[^1] ``` #### 4. **处理复杂绑定** - **自定义属性**:通过$@BindingAdapter$实现网络图片加载等逻辑: ```java @BindingAdapter("imageUrl") public static void bindImageUrl(ImageView view, String url) { Glide.with(view).load(url).into(view); // 使用第三方库加载图片[^4] } ``` - **事件绑定**:在布局中直接绑定点击事件: ```xml <Button android:onClick="@{() -> viewModel.onButtonClick()}" .../> ``` #### 5. **优势与注意事项** - **优势**:减少$findViewById$调用,UI更新自动化,代码可读性提升[^3] - **注意**:避免在布局中编写复杂逻辑,建议与ViewModel或Presenter模式结合
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值