【问题标题】:Typescript: How to access function from browser consoleTypescript:如何从浏览器控制台访问功能
【发布时间】:2020-09-19 23:13:01
【问题描述】:

上下文

ts/app.ts,有:

function foo() {
    console.log('Hello Word');
}

它使用Webpack成功编译成bundle.js并加载:

<script src="dist/bundle.js"></script>

问题

如何从我的浏览器控制台执行foo

> foo()
Uncaught ReferenceError: foo is not defined

【问题讨论】:

    标签: javascript typescript webpack


    【解决方案1】:

    因为你有它,你不能全局访问它。但如果你愿意,你可以这样做

    function foo() {
        console.log('Hello Word');
    }
    
    (window as any).foo = foo;
    

    那么它应该在window 对象上可用(这意味着您可以以window.foo() 或只是foo() 访问它,因为window 对象是全局对象。

    变量和方法如foo 是它们默认所在的模块(即文件)私有的。您可以像这样导出它们:

    export function foo() {
        console.log('Hello Word');
    }
    
    

    这意味着您可以从其他模块导入它们,即

    import {foo} from "foo";
    foo();
    

    但是浏览器本身不理解 importexport 语法 (*) 所以它们仍然不是全局的。是 webpack 理解语法并将它们拼接成浏览器可以使用的形式(在你的“dist/bundle.js”文件中)。看看那个文件,你会看到 webpack 插入的引导代码。

    (*) 编辑:Browsers are starting to support modules:

    基本上,没有什么是全局的,但这是一件好事,否则它们可能会相互冲突。也就是说,它不会是模块化的。

    【讨论】:

    • 谢谢,能不能也解释一下为什么不能在全球范围内使用?
    • 我添加了更多细节,但我认为简短的回答是“它不应该是全球性的”:-)
    • 我认为较新的浏览器现在支持模块加载。另外,那是什么(window as any)?那是有效的 JS 吗?
    • @weltschmerz,不,它不是有效的 JS。它是有效的 TypeScript,它知道 window 上有哪些方法和属性,并且会在编译时反对 foo。当 TypeScript 被转译为 JS 时,它只是 window.foo = foo;,因为 JS 没有静态类型信息。不过我还没有听说过支持模块加载的浏览器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2022-06-11
    • 2013-07-14
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多