当前位置: 首页 > 知识库问答 >
问题:

前端 - ts-node 与 import 使用疑惑?

归鸿朗
2023-11-01
// **.tsfunction a() {    console.log(this);}a(); 

执行命令 ts-node **.ts 正常输出this

// **.tsimport './**'function a() {    console.log(this);}a(); 

执行命令 ts-node **.ts 输出undefined

这是为什么?可以避免吗?

共有2个答案

司寇琨
2023-11-01

两个点,涉及到 esmstrict mode

  • 使用了 import 则代表这是一个 es module,会自动开启 strict mode
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...
    image.png
  • 其次,在 strict mode 下,没有指定 this 的函数中,this 值为 undefined
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...
    image.png
东方嘉木
2023-11-01

当你使用 import './**',你实际上是在尝试导入当前目录下的所有模块。这在你尝试导入的文件中可能不会产生预期的效果,因为 this 的值取决于函数被如何调用。

在JavaScript中,this 的值在函数被调用时决定,而不是在函数被创建时决定。在严格模式下,如果函数是单独调用的,那么 this 的值就是 undefined

在你的例子中,a 函数被单独调用,所以 this 的值是 undefined。你可以通过将 a 函数绑定到一个特定的对象上,来避免这个问题。例如:

// **.tsimport { bind } from 'lodash'; // lodash 是 JavaScript 实用程序库function a() {    console.log(this);}const boundA = bind(a, { name: 'boundA' }); // 将 a 绑定到一个有 name 属性的对象上boundA(); // 输出: { name: 'boundA' }

如果你想要更深入地了解 this 在JavaScript中的工作原理,我建议你阅读一些关于该主题的书籍或教程。

 类似资料:
  • 我创建了一个ts文件如下: 当我运行时候报错: 如果我用require就可以引入。 执行成功。 是否这个意思意味的是,ts-morph 这个库没有导出esm模块,只导出了cjs模块?

  • options 怎么会是这个类型?应当是{ [key: string | number]: any }[] 才对啊。 是哪里出了问题?如何解决呢? "vue-tsc": "^1.8.27"

  • RESTful API using Node.js, Express, Mongoose & TypeScript This is a boilerplate for building scalable and robust REST APIs using Node.js & TypeScript. Table of Contents Prerequisites Features Getting

  • 下面这一段 TS 代码是什么意思,如果我把 T 传入 Animal 类型,Simplify 的类型是什么样子的?仍然是跟 Animal 一样的类型吗?

  • 本文向大家介绍Python import与from import使用及区别介绍,包括了Python import与from import使用及区别介绍的使用技巧和注意事项,需要的朋友参考一下 下面介绍下Python import与from import使用,具体内容如下所示: Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。Python本