function Foo() { getName = function() { console.log(1); }; return this; } Foo.getName = function() { console.log(2); }; Foo.prototype.getName = function() { console.log(3); }; var getName = function() { console.log(4); }; function getName() { console.log(5); } getName(); Foo().getName(); getName();
时间: 2023-06-13 15:02:58 浏览: 55
这段代码输出的结果是:
5
1
1
首先,在代码执行之前,JavaScript 引擎会对函数和变量进行提升,因此先声明了变量 `getName` 和函数 `getName`。
接下来,调用 `getName()` 函数,会输出 5,因为这里的 `getName()` 指的是变量 `getName`,它被提升到了顶部,并且在赋值之后,它的值是函数。
然后,执行 `Foo().getName()`,这里需要注意的是 `Foo()` 返回的是 `this`,而 `this` 是全局对象,在浏览器中通常是 `window`。因此,这句代码相当于调用 `window.getName()`。在 `Foo()` 函数内部,有一个局部变量 `getName` 被赋值为函数,因此输出 1。
最后,再次调用 `getName()`,输出的仍然是 1,因为在全局作用域中,变量 `getName` 已经被重新赋值为函数。
相关问题
function Foo() { getName = function() { console.log(1); }; return this; } Foovar getName = function() { console.log(4); };Foo().getName(); getName(); 为什么打印的是1
这道题目考察了JavaScript中函数作用域以及this的指向。
首先,我们来看一下 `Foo()` 函数。函数中定义了一个 `getName` 函数,并将其赋值给了一个全局变量 `getName`。在 `Foo()` 函数中,我们还返回了 `this`,也就是全局对象 `window`。
接下来,我们调用了 `Foo().getName()`。这里需要注意的是,调用 `Foo()` 函数后返回的是全局对象 `window`,因此相当于执行了 `window.getName()`。而在执行 `window.getName()` 之前,我们在 `Foo()` 函数中重新定义了 `getName` 函数,所以最终输出的是1。
最后,我们再次调用 `getName()` 函数,此时输出的是4,因为在全局作用域中,`getName` 函数的值已经被重新定义为4了。
public static void main(String[] args) { Foo foo = new Foo(); // Thread t1 = new Thread(()->foo.methodA()); Thread t1 = new Thread(foo::methodA); Thread t2 = new Thread(foo::methodB); t1.start(); t2.start(); } } class Foo{ public synchronized void methodA(){ Thread t = Thread.currentThread(); System.out.println(t.getName()+":正在执行A方法..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getName()+":执行A方法完毕"); } public void methodB(){ synchronized(this) { Thread t = Thread.currentThread(); System.out.println(t.getName() + ":正在执行B方法..."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(t.getName() + ":执行B方法完毕"); } }
这段代码展示了Java中的synchronized关键字的使用。synchronized关键字可以用来保证多个线程在访问共享资源时的线程安全性,通过对类或对象加锁来实现。
在这个例子中,Foo类的methodA()方法和methodB()方法都是synchronized方法,它们都使用了this对象作为锁。当一个线程执行methodA()方法时,它会获取this对象的锁,其他线程就无法同时执行methodA()方法或methodB()方法,直到该线程释放锁。因此,在本例中,t1和t2线程不能同时执行methodA()方法或methodB()方法,它们必须交替执行。
需要注意的是,在methodB()方法中,使用了synchronized(this)语句块,这与直接将methodB()方法声明为synchronized方法的效果是一样的,但是它的范围更小,只对synchronized(this)中的代码块加锁。这种方式可以避免对整个方法进行加锁,提高了程序的效率。