java中this用法和javascript中的this用法

Java与JavaScript中this区别
本文对比了Java和JavaScript中this关键字的使用方法,包括在类成员引用、构造函数调用及函数作用域等方面的不同,并介绍了JavaScript中apply()和call()方法的应用。

今天回顾了一下java基础,突然发现自己把java和JavaScript中this的概念混淆了,所以记录一下以备不时之需

java:

1.this它可以在类里面来引用这个类的属性和方法

代码:

public class Test {
    private int x = 10;
    public Test(int x){
        System.out.println("赋值前的全局变量"+this.x);
        System.out.println("形参x="+x);
        this.x = x;
        System.out.println("赋值后的全局变量"+this.x);
    }
    public static void main(String[] args) {
        Test t = new Test(11);
    }

}

结果:

赋值前的全局变量10
形参x=11
赋值后的全局变量11


2.通过this 这个关键字返回自身这个对象

代码:

public class ThisDemo {
    private int count ;   //全局变量Java虚拟机都会先自动给它初始化为默认值。 而局部变量不行
    public ThisDemo add(){
        count++;
        return this;
    }
    public void print(){
        System.out.println("count="+count);
    }
    public static void main(String[] args) {
        new ThisDemo().add().add().print();
    }
}
结果:count=2

其中初始化赋值如下

             Boolean      false
             Char           '\u0000'(null)
             byte            (byte)0
             short           (short)0
             int               0
             long            0L
             float            0.0f
             double        0.0d

3.构造函数之间的调用

代码:

public class ThisDemo {
    String name ;
    int age ;
    public ThisDemo(){
        this.age = 21;
    }
    public ThisDemo(String name,int age){
        this();函数有所属对象时:指向所属对象函数有所属对象时:指向所属对象
        this.name = name;
    }
    
    public void print(){
        System.out.println("赋值后的名字"+this.name);
        System.out.println("赋值后的年龄"+this.age);
    }
    public static void main(String[] args) {
        new ThisDemo("桂纶镁",23).print();
    }
}

结果:

赋值后的名字桂纶镁
赋值后的年龄21

javascrip:

1.函数有所属对象时:指向所属对象

代码:

    var myObject = {
        value : 10
    };
    myObject.fun = function(){
        var value = 100;
        alert(value);
        alert(this.value);
        alert(this);   //这里的this指的是调用他的对象(myObject),如果没有写在myObject里面的话调用他的则是window
    };
    myObject.fun();

结果:100

         10

         Object

2.函数没有所属对象:指向全局对象(将上述代码进行小小的改动)

代码:

var myObject = {
        value : 10
    };
    myObject.fun = function(){
        fun1 = function(){
            alert("fun1:"+this.value);
        }
        var value = 100;
        alert(value);
        alert(this.value);
        alert(this);
    };
    myObject.fun();
    fun1();

结果:

100

10

Object

fun1:undefined

分析:

因为fun1()这个函数没有绑定在任何一个对象上,所以它属于window这个对象,所以它的this指的是全局变量,而全局变量没有这个value

所以就为undefined

3.构造器中的 this:指向新对象

代码:

var value = 10 ;
fun = function(){
    var value = 100;
    alert(this.value);
    alert(value);
}
fun();
var f = new fun();

结果:

10

100

undefined

100

分析:我用了两次调用来区分new一个函数和普通函数的区别,很明显,当我new一个函数的时候,这时他所属的对象是f,而f没有value这个值,所以它的this.value为undefined


既然都是作用域,就扩展一下说一下apply()和call()的异同

相同点:两个方法产生的作用是完全一样的。

不同点:方法传递的参数不同

function A(){
    this.flag = 'A';
    this.tip = function(){
        alert(this.flag);
    };
};
function B(){
    this.flag = 'B';
};
var a = new A();
var b = new B();
a.tip.call(b);

a.tip.apply(b);

两次运行结果都是B,注意这里tip是属性所带的方法,之前写错了看很久才发现,apply()和call()都是function.prototype里自带的

想让window调用的话这里可以写apply(null)或者apply(window)


总结一下:

java中this.value可以再本类中调用全局变量,也可以在构造器中用this()调用其他构造器,也可以用this表示当前对象

JavaScript中this指的是这个函数所属的对象的值,当new一个函数时,这个this就会指向这个new出来的对象,apply()和call()可以改变一个函数中this指向的对象

没有var的变量都代表的是全局变量哟

### Java JavaScript 中 `this` 关键字的区别 在 Java JavaScript 中,`this` 关键字都用于引用当前对象或上下文中的某个值,但它们的使用方式行为存在显著差异。 #### 1. **Java 中的 `this`** 在 Java 中,`this` 是一个指向当前对象的关键字。它主要用于以下几种情况: - **区分成员变量与局部变量**:当方法参数或局部变量与类的成员变量同名时,可以使用 `this` 来明确引用成员变量[^3]。 - **调用构造函数**:在一个构造函数中,可以通过 `this()` 调用另一个构造函数(必须是第一行)。 - **传递当前对象**:将当前对象作为参数传递给其他方法或构造函数。 Java 的 `this` 指向是固定的,始终代表当前正在调用方法的对象实例,且在编译时就已经确定。 ```java public class Person { private String name; public Person(String name) { this.name = name; // 使用 this 区分成员变量局部变量 } public void printName() { System.out.println(this.name); } } ``` #### 2. **JavaScript 中的 `this`** JavaScript 中的 `this` 更加灵活,其指向是在运行时动态决定的,而不是在定义时确定。这种动态性使得 `this` 在不同的执行上下文中可能指向不同的对象,导致其行为较为复杂[^1]。 常见的 `this` 指向规则包括: - **全局上下文**:在浏览器中,`this` 指向 `window` 对象;在 Node.js 中,指向 `global` 对象。 - **函数上下文**:普通函数调用时,`this` 默认指向全局对象(非严格模式下),而在严格模式下为 `undefined`。 - **对象方法调用**:如果函数作为对象的方法被调用,`this` 指向该对象。 - **构造函数调用**:通过 `new` 创建对象实例时,`this` 指向新创建的对象。 - **显式绑定**:通过 `call()`、`apply()` 或 `bind()` 方法可以显式指定 `this` 的值。 ```javascript const person = { name: "Alice", greet: function() { console.log(`Hello, my name is ${this.name}`); } }; person.greet(); // this 指向 person 对象 function sayHi() { console.log(`Hi, I'm ${this.name}`); } sayHi(); // 非严格模式下 this 指向 window(浏览器环境) const boundSayHi = sayHi.bind({ name: "Bob" }); boundSayHi(); // this 指向 { name: "Bob" } ``` #### 3. **主要区别总结** | 特性 | Java 中的 `this` | JavaScript 中的 `this` | |------|------------------|------------------------| | **指向时机** | 编译时确定 | 运行时动态确定 | | **作用范围** | 始终指向当前对象 | 可能指向全局对象、任意对象或 `undefined` | | **灵活性** | 固定不变,不易出错 | 灵活但容易误解,需谨慎处理 | | **用途** | 主要用于区分变量、调用构造函数 | 用于动态绑定上下文,支持多种调用模式 | JavaScript 的 `this` 提供了更大的灵活性,但也增加了理解上的难度,尤其是在回调函数、事件处理等场景中需要特别注意上下文的变化[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值